今天上午,我的云功能正常运行。但是现在它突然停止工作了。因此,我添加了更多日志,并发现rootRef.once
没有执行。为什么会这样呢?该功能会不断超时。
exports.assignTeams = functions.https.onCall((data, context) => {
const judgeId = data.judgeId;
console.log("Assigning teams to judge ", judgeId);
var db = admin.database();
var rootRef = db.ref("/");
rootRef.once(
"value",
function(snapshot) {
console.log("Passed value ", snapshot);
processAssignedQueue(snapshot, judgeId);
},
function(error) {
console.log("ERROR:\n" + error);
return { teams: [] };
}
);
});
控制台从Firebase记录日志:
答案 0 :(得分:2)
问题是您没有从函数解析返回要发送给调用者的数据的承诺。现在,您的函数实际上什么也不返回,因为once()
是异步的,并且在查询完成之前立即返回。当可调用函数没有承诺返回时,它将立即关闭,任何异步工作都不会完成。
此外,您还应该注意,传递给after()的回调内部的return语句仅是来自各个函数回调的返回值,而不是整个函数的返回值。
您应该做的是利用once()
返回的承诺,并使用该承诺确定退还给客户的内容。这是一个简单的示例:
return rootRef.once("value")
.then(snapshot => {
console.log("Passed value ", snapshot);
return { data: snapshot.val() }
})
.catch(error => {
console.log("ERROR:\n" + error);
return { teams: [] };
});
为了有效地编写Cloud Functions,您需要完全了解javascript的工作原理。如果您不能正确使用它们,您的功能将以神秘的方式失败。