其余功能完成后 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})
我的 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})