我返回事务承诺,它应该等待事务完成,然后再停止函数。交易执行良好,但承诺似乎永远不会解决。
我在 Firebase 控制台中看到此功能总是在 60 秒后超时。
const functions = require('firebase-functions');
const admin = require("firebase-admin");
const db = admin.database();
export let countFollowers = functions.database.ref('followers/{followee}/{follower}').onWrite(event => {
const followee = event.params.followee;
let path = `posts/${followee}/cnt_foll`;
const countRef = db.ref(path);
let out = countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (parseInt(current) || 0) + 1;
} else if (!event.data.exists() && event.data.previous.exists()) {
return (parseInt(current) || 0) - 1;
}
});
return out;
});
编辑:
我用下面的"hack"解决了这个问题,我自己创建了一个承诺,因为无论.transaction
返回什么都不起作用:
return new Promise(function(resolve, reject) {
countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (parseInt(current) || 0) + 1;
} else if (!event.data.exists() && event.data.previous.exists()) {
return (parseInt(current) || 0) - 1;
}
}, () => resolve(null));
});
旧版本的 Firebase-admin SDK 存在一个已知问题,即 Firebase 数据库引用和快照无法通过 JSON 序列化,因此无法用于 Cloud Functions 的返回值。这包括事务返回值,因为它们也有快照。
您的黑客可以解决该错误;如果您更新Firebase-admin版本,也应该得到修复。