计算云函数中的孙节点

Count grandchild nodes in a cloud function

我有以下数据结构:

/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 控制台中收到错误消息:

Error serializing return value: TypeError: Converting circular structure to JSON

如内联所说here:

您 运行 遇到的问题是 ref.transaction returns 的承诺值无法序列化为 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));
});