返回值在Firebase Cloud Functions中重要吗

jpfvwuh4  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(164)

我正在编写Firebase可以用TypeScript运行,下面是一个更新文档的简单方法。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);

export const handleTestData = functions.firestore.document('test/{docID}').onCreate(async (snap, context) => {
    const data = snap.data();
    if (data) {
        try {
                await admin.firestore().doc('test1/' + context.params.docID + '/').update({duplicate : true});
            } catch (error) {}
    }
});

在这个方法中,promise是由asyncawait处理的,没有return语句,它工作得很好。我看到的大多数示例/教程都在每个方法中有一个return语句。在Firebase Cloud Functions中不返回任何东西会有什么影响/区别吗?如果我应该返回一些东西,我可以返回null吗?

axr492tv

axr492tv1#

返回值在Firebase Cloud Functions中重要吗?
是的,它确实是key,在执行异步处理(也称为“后台函数”)的Cloud Function中,当所有异步处理完成时返回JavaScript promise,如documentation中所解释的那样。
这样做很重要,主要有两个原因(摘自该文档):
1.确保运行Cloud Function的Cloud Functions示例在您的函数成功达到其终止条件或状态之前不会关闭。
1.您可以避免运行时间过长或无限循环的云函数产生过多费用。

为什么即使您没有返回承诺,云函数也能正常运行?

通常,您的Cloud Function应该在异步操作完成之前终止,因为您没有返回Promise,因此向Cloud Functions平台指示它可以终止运行Cloud Function的Cloud Functions示例。
但有时候云函数平台并不会立即终止函数,异步操作也可以完成,这是完全无法保证的,也是完全无法控制的。
经验表明,对于短时间的异步操作,最后一种情况经常发生,开发人员认为一切正常。但是,突然有一天,云函数不工作......有时它确实工作:开发人员正面临着一个没有任何清晰逻辑的“不稳定”行为,这使得调试非常困难。你会在Stack Overflow中找到很多说明这种情况的问题。
所以具体来说,在你的情况下,你可以像这样调整你的代码:

export const handleTestData = functions.firestore.document('test/{docID}').onCreate(async (snap, context) => {
    const data = snap.data();
    if (data) {
        try {   
                // See the return below: we return the Promise returned by update()
                return admin.firestore().doc('test1/' + context.params.docID + '/').update({duplicate : true});
         } catch (error) {
               return null;  // <- See the return
        }
    } else {
       return null;  // <- See the return
    }
});

或类似

export const handleTestData = functions.firestore.document('test/{docID}').onCreate(async (snap, context) => {
    const data = snap.data();
    if (data) {
        try {
                await admin.firestore().doc('test1/' + context.params.docID + '/').update({duplicate : true});
                return null;  // <- See the return
         } catch (error) {
               return null;  // <- See the return
        }
    } else {
       return null;  // <- See the return
    }
});

返回null(或true,或1 ...)是有效的,因为async函数总是返回Promise。

相关问题