计算云函数中的孙节点
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));
});
我有以下数据结构:
/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));
});