typescript - 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;
})
解决方案
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);
}
})
实际上,您甚至不应该尝试捕获错误 - 如果写入因某些原因而失败,只需让函数错误出来。