异步https firebase功能

时间:2017-08-09 10:56:48

标签: firebase google-cloud-functions

HTTPS函数是否应该像实时函数一样返回异步承诺? 我们还没有在HTTPS函数中返回(只使用res.status.send等),而且看起来firebase / function-samples也不是。但文档略显含糊https://firebase.google.com/docs/functions/terminate-functions

4 个答案:

答案 0 :(得分:6)

HTTP函数当前不尊重返回的promise - 它们需要发送结果才能正常终止。如果HTTP函数没有发送结果,它将超时。

所有其他类型的函数都需要返回的promise,以便等待异步工作完全完成。

如果您没有等待的异步工作,您可以立即返回。

这些是文档中概述的三个案例。

答案 1 :(得分:0)

您的云功能应使用以下任一方式返回“结束”

  

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

返回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();
            });
    });
}

答案 2 :(得分:0)

经过深思熟虑后,这是一个Promise实现的实现,我可以从Google Cloud函数中返回一个值,该函数需要进行第三方异步调用:

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);
        });
    });

});

答案 3 :(得分:0)

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

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