首页 > 解决方案 > Firebase 云函数数据库触发器有时无法正确运行

问题描述

我编写了以下运行良好的代码。但是最近我发现触发器有时不会更新内部值。我的代码有什么问题吗?我在下面附上了日志和代码。

日志:请求 0411193257728 的内部标志在 30 秒后未更新。

7:33:01.008 pm
publishRequest
call constructor
7:33:01.777 pm
publishRequest
process the request ref = 0411193257728
7:33:02.096 pm
publishRequest
Function execution took 30038 ms, finished with status: 'ok'
7:33:02.098 pm
publishRequest
request 0411193231315 updated !
7:33:31.786 pm
publishRequest
Function execution took 31465 ms, finished with status: 'ok'
7:36:30.592 pm
publishRequest
Function execution started
7:36:30.603 pm
publishRequest
process the request ref = 0411193630508
7:37:00.607 pm
publishRequest
Function execution took 30016 ms, finished with status: 'ok'
7:37:02.295 pm
publishRequest
request 0411193630508 updated !

代码

exports.publishRequest= functions.database.ref("Request/{requestID}")
.onCreate( async (snap, context) =>{  
    console.log("process the request ref = " + context.params.requestID);
    await sleep(30000);   
    snap.ref.child("internal").set(false)
            .then((value) =>{ console.log("request " + context.params.requestID + " updated !")} )
            .catch((error) => console.error(error));
    return;
})    

标签: typescriptfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


set()是异步的并返回一个承诺。由于您使用的是 async/await 语法,因此您应该使用它来确保函数等待直到写入完成。如果您不希望 promise 得到解决,Cloud Functions 可能会在异步工作完成之前终止并清理它。

exports.publishRequest = functions.database.ref("Request/{requestID}")
.onCreate( async (snap, context) =>{  
    console.log("process the request ref = " + context.params.requestID);
    await sleep(30000);   
    try {
        await snap.ref.child("internal").set(false)
        console.log("request " + context.params.requestID + " updated !");
    }
    catch (error) {
        console.error(error);
    }
})    

实际上,您甚至不应该尝试捕获错误 - 如果写入因某些原因而失败,只需让函数错误出来。


推荐阅读