我有一个在创建帐户时触发的云功能。此功能会在用户的Firebase数据库条目中填充一些字段。其中一个字段名为“accntActive'”,并触发第二个云功能来执行其他任务。
在更改accntActive字段时触发的第二个云函数中,我要做的第一件事是读取accntActive的值以检查它是否已更改为值' true'。我所看到的是,大约50%的时间,当我尝试使用此值时云功能崩溃,说它是未定义/ null。直到一周前,这种情况一直很好,100%的时间,因此代码本身没有改变。当我稍后检查用户的数据库条目时,100%的时间已正确填充。
我想知道是否存在某种竞争条件,其中DB云功能在写入的值稳定之前被触发,因此无法立即读取。考虑到数据库云功能的全部要点是响应正在改变的值,这看起来有点荒谬。
第二个功能的代码:
exports.myActiveFxn = functions.database.ref('/users/{uid}/accntStatus/active')
.onWrite(event => {
const accntActive = event.data.val();
const userID = event.params.uid;
console.log(accntActive.toString()) //This throws an exception since accntActive is sometimes undefined
在上面,请注意userID变量始终是稳定的。我甚至尝试在函数内部重新读取一次值,我得到了相同的结果:
admin.database().ref('/users/'+userID+'/accntStatus/active').once('value').then(function (snapshot) {
var accntActive = snapshot.val();
console.log(accntActive.toString());
}).then(function() {
有人对我能做些什么来解决这个问题有任何见解吗?提前谢谢!
编辑:这是第一个函数的代码
exports.authUserCreated = functions.auth.user().onCreate(function(event) {
var UID = event.data.uid;
admin.database().ref('/users/'+UID).set({
email: event.data.email,
accntStatus: {
active: "true",
key: randomstring.generate(22)
},
uid: UID
});
return;
});
答案 0 :(得分:1)
在您的函数中,您没有返回在工作完成时解析的承诺。如果你不这样做,可能会发生奇怪和不一致的事情。请阅读async programming with Cloud Functions上的文档。
您应该从函数返回数据库引用中由set()
方法返回的promise。
exports.authUserCreated = functions.auth.user().onCreate(function(event) {
var UID = event.data.uid;
return admin.database().ref('/users/'+UID).set({
email: event.data.email,
accntStatus: {
active: "true",
key: randomstring.generate(22)
},
uid: UID
});
});