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

Firebase 数据库触发器是否存在竞争条件?将非null值返回为null,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个在创建帐户时触发的云函数。此函数用于填充用户Firebase数据库条目中的几个字段。其中一个字段名为“accntActive”,并触发第二个云函数来执行其他一些任务 在第二个云函数中,当accntActive字段发生更改时触发,我要做的第一件事是读取accntActive的值,以检查它是否已更改为值“true”。我看到的是,大约有50%的时间,当我试图使用这个值时,云函数崩溃,说它是未定义的/空的。直到一周前,这一直很好,100%的情况下,所以代码本身没有改变。当我在稍后的时间点检查用户

我有一个在创建帐户时触发的云函数。此函数用于填充用户Firebase数据库条目中的几个字段。其中一个字段名为“accntActive”,并触发第二个云函数来执行其他一些任务

在第二个云函数中,当accntActive字段发生更改时触发,我要做的第一件事是读取accntActive的值,以检查它是否已更改为值“true”。我看到的是,大约有50%的时间,当我试图使用这个值时,云函数崩溃,说它是未定义的/空的。直到一周前,这一直很好,100%的情况下,所以代码本身没有改变。当我在稍后的时间点检查用户的DB条目时,它100%的时间都已正确填充

我想知道是否存在某种竞争条件,在写入的值稳定之前触发DB cloud函数,因此无法立即读取。这似乎有点荒谬,因为DB cloud函数的整个要点就是响应正在更改的值

第二个函数的代码:

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

在您的函数中,您没有返回在工作完成时解决的承诺。如果你不这样做,奇怪和不一致的事情可能会发生。请阅读上的文档

您应该从函数返回由数据库ref上的set方法返回的承诺

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

请同时显示第一个函数的代码。添加了触发DB onWrite函数的请求启动函数!我希望道格很快会给出一个权威的答案。同时,您需要为authUserCreated中的异步处理返回admin.database.ref'/users/'+UID.set。。。;。如果没有它,云函数可能会过早终止您的函数。没有正在计算的空值。这是来自删除事件,与此无关。抱歉!。问题是云功能偶尔不会触发。我通过python库添加用户。似乎当我添加用户的速度太快时,虽然他们确实被正确添加了,但他们并不总是触发我的authUserCreated函数!当帐户创建过快时,auth.user.onCreate触发器不会发生任何已知问题吗?我在创建账户之间增加了60秒的延迟,这已经解决了这个问题。我没有听说过任何利率限制。如果您有一个明显的bug需要报告,请将它与如何复制它的完整细节一起归档。谢谢你的链接。今天我将提交一个包含全部细节的问题!