计算云功能中的孙子节点

时间:2017-09-18 14:27:32

标签: node.js firebase firebase-realtime-database google-cloud-functions firebase-admin

我有以下数据结构:

/users
    /{user_uid}
        /lists
            /{list_uid}

使用云功能,我希望能够对我的数据库的根目录进行/list_count引用,以便能够轻松跟踪列表计数,而无需执行胖客户端打电话来计算它们。

目前我有这个实现,我觉得有点难看:

exports.countlists = functions.database.ref('/users/{uuid}/lists').onWrite(event => {
    const ref = event.data.ref.parent.parent.parent.child('list_count');

    return ref.transaction(current => {
        if (event.data.exists() && !event.data.previous.exists()) {
            return (current || 0) + 1;
        }
        else if (!event.data.exists() && event.data.previous.exists()) {
            return (current || 0) - 1;
        }
    });
});

问题是我在firebase控制台中收到错误:

  

序列化返回值时出错:TypeError:将循环结构转换为JSON

1 个答案:

答案 0 :(得分:1)

正如Inlined所说here

您遇到的问题是ref.transaction返回的承诺值不能作为JSON序列化。解决此问题的最简单方法(在我们在Firebase SDK中修复它之前)是将值转换为null。

我认为要解决您的问题,请执行此操作:

exports.countlists = functions.database.ref('/users/{uuid}/lists').onWrite(event => {
let root = admin.database().ref(`users/${event.params.uuid}/lists/list_count`)

    return root.transaction(function(current){
        if (event.data.exists() && !event.data.previous.exists()) {
            return (current || 0) + 1;
        }
        else{
            return (current || 0) - 1;
        }
    }.then(() => null));
});