其余功能完成后 3 分钟,Firebase firestore 更新 运行

Firebase firestore update running 3 minutes after rest of the function completes

我的 GCP Firebase 功能设置如下:

exports.sendEmail = functions.firestore.document('/work_orders/{documentId}')
  .onUpdate(async (change, context) => {

   // code here --
   // then ends like this:

    functions.logger.log('Log Before Interval Start')
    const interval = setInterval(async ()=> {
        if (attachment && attachment_2){ 
            clearInterval(interval)
            functions.logger.log('Attachments Ready')

            const resp = await send_email()
            functions.logger.log('Doc Created', context.params.documentId, newValue)
            functions.logger.log('Resp Created', resp)
            return change.after.ref.update({emailSent: true, createEstimateEmail: false})
    }, 1000)
    functions.logger.log('Log After Interval')
})




一切运行都很好。电子邮件立即发送。但是当涉及到 change.after.ref.update 部分时,完成这个简单的提交大约需要 3 分钟。当它最终完成时,它再次触发函数 运行,因为它是 onUpdate。 (第二个 运行 在检查是否应该 运行 的标志后立即退出)

有什么方法可以让我立即提交?

更新:日志。 您可以看到 4 分钟后该功能被重新触发。此触发器必须归因于更新的 firestore 文档。你可以看到它立即结束,因为函数检查 createEstimateEmail 并在它是 false 时结束。因此,最后一行到 运行 大约需要 4 分钟。 (如果我使用 Google 控制台检查 Firestore,它在完成 运行ning 后的几分钟内也不会更新。)

2022-01-02 10:30:41.968 ASTsendEmail51lrasb9sh8s Function execution started
2022-01-02 10:30:44.058 ASTsendEmail51lrasb9sh8s Log Before Interval Start
2022-01-02 10:30:44.059 ASTsendEmail51lrasb9sh8s Log After Interval
2022-01-02 10:30:44.124 ASTsendEmail51lrasb9sh8s Function execution took 2158 ms, finished with status: 'ok'
2022-01-02 10:30:45.060 ASTsendEmail51lrasb9sh8s Attachments Ready
2022-01-02 10:30:45.060 ASTsendEmail51lrasb9sh8s Attachments Ready
2022-01-02 10:30:51.336 ASTsendEmail51lrasb9sh8s Doc Created vKFOnZ9usRaDiJ6Nu9Yk
2022-01-02 10:30:51.937 ASTsendEmail51lrasb9sh8s Resp Created [ Response { statusCode: 202, body:....

2022-01-02 10:34:20.391 ASTsendEmail51lrfqr7kldb Function execution started
2022-01-02 10:34:20.402 ASTsendEmail51lrfqr7kldb Function execution took 12 ms, finished with status: 'ok'

按照 RJC 的建议添加更多日志记录 points/logs 后修复了它。本质上,该功能在所有工作完成之前就结束了。

这个答案对处理 setInterval() 有帮助:

在主要 onUpdate() 函数中正确运行的最终代码:

    async function waitUntil() {
      return await new Promise(resolve => {
        const interval = setInterval(() => {
          if (attachment && attachment_2) {
            clearInterval(interval);
            const msg = {....};
            resolve(msg);
          };
        }, 1000);
      });
    }

    const msg = await waitUntil()
    const resp = await sgMail.send(msg)
    return change.after.ref.update({emailSent: true, createEstimateEmail: false})