异步 https firebase 函数

Asynchronous https firebase functions

HTTPS 函数 return 像实时函数这样的异步承诺必须如此吗? 我们还没有 return 使用 HTTPS 函数(仅使用 res.status.send 等),看起来 firebase/function-samples 也不是。但是文档有点模棱两可 https://firebase.google.com/docs/functions/terminate-functions .

您的云函数应 return"end" 具有以下任一

res.redirect(), res.send(), or res.end()

他们所说的 returning promises 的意思是,假设您有一个云函数来更新实时数据库中的节点,您希望在响应 HTTP 请求之前完成该工作。

示例代码

let RemoveSomething = functions.https.onRequest((req, res) => {
    cors(req, res, () => {
        // Remove something
        DoDatabaseWork()
            .then(function (result) {
                res.status(200).send();
            })
            .catch(function (err) {
                console.error(err);
                res.status(501).send();
            });
    });
});

更新:添加了 DoDatabaseWork 示例。

const DoDatabaseWork = function () {
    return new Promise(function (resolve, reject) {
        // Remove SomeNode
        admin.database().ref('/someNode/').remove()
            .then(function (result) {
                resolve();
            })
            .catch(function (err) {
                console.error(err);
                reject();
            });
    });
}

HTTP 函数目前不遵守 returned 承诺 - 它们需要发送结果才能正常终止。如果 HTTP 函数没有发送结果,它将超时。

所有其他类型的函数都需要 returned promise 才能等待异步工作完全完成。

如果您没有任何异步工作要等待,您可以立即return。

这些是文档中概述的三种情况。

环顾四周后,这是一个 Promise 的实现,对我来说 return 来自 Google Cloud Function 的值,该函数需要 [=14] =] 异步调用:

exports.getSomeAccessToken = functions.https.onCall((data, context) => {

    var dataStr = JSON.stringify(data, null, '\t');   
    console.log('ENTER [getSomeAccessToken], got dataStr:  ' + dataStr);

    return new Promise((resolve, reject) => {

        gateway.clientToken.generate({}, function (err, gatewayResponse) {

            var result = {
                clientToken: gatewayResponse.clientToken
            };

            var resultStr = JSON.stringify(result, null, '\t');
            console.log("resultStr : " + resultStr);

            resolve(result);
        });
    });

});

现在可以在最新的 Firebase 中使用:

exports.asyncFunction = functions.https.onRequest(async (request, response) => {
    const result = await someAsyncFunction();
    response.send(result);
});