云功能已完成状态:'timeout',同时将数据添加到 Firestore



这是代码,

exports.onEmailRecieved = functions.database
.ref("/emails/recieved/{id}/")
.onCreate(async (snapshot, context) => {
const email = snapshot.val();
const id = context.params.id;
const trimmedEmailBody = String(email.body).replace("n", "").trim();
if (trimmedEmailBody === cmd) {
const queueRef = fs.collection("requests").doc("all").collection("queue");
await fs
.runTransaction(async (t) => {
const doc = await t.get(queueRef);
const size = doc.size;
console.log(`Size: ${size}`);
console.log("Adding to queue.");
await queueRef
.add({
email: email.email,
subject: email.subject,
body: email.body,
})
.then(() => {
console.log("Successfully added to queue.");
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log("It's finally over.");
});
return console.log("Worked?");
})
.then(() => {
return console.log("Complete");
})
.catch((err) => {
return console.log(err);
});
return console.log("Worked I guess.");
} else {
return console.log("Not equal.");
}
});

不要介意那些无用的console.log。添加它们是为了调试错误。

第一个console.log被调用,然后什么都没有,没有thencatchfinally函数被触发,我在日志中得到一个状态为"timeout"的函数。

我做错了什么?

add()方法返回一个promise,然后当您等待promise时,该函数将以非阻塞的方式暂停,直到promise结束。它将等待事务完成后再解决文档的创建问题,这会导致云功能超时,默认为1分钟。通过删除add方法上的await,您将执行该函数。参见以下代码:

messageRef
.add({
email: "email",
subject: "subj",
body: "body",
})
.then(() => {
console.log("Successfully added to queue.");
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log("It's finally over.");
});

这将返回如下内容:

Size: 1
Adding to queue.
test
Successfully added to queue.
It's finally over.

有关更多相关信息,您可以查看以下文档:

  • 同步、异步和承诺
  • 集合参考
  • 如何使用承诺

最新更新