数据库触发器是否存在竞争条件?将非null值返回为null

时间:2018-02-08 19:05:36

标签: firebase firebase-realtime-database google-cloud-functions

我有一个在创建帐户时触发的云功能。此功能会在用户的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;
});

1 个答案:

答案 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
    });
});