异步https Firebase Google Cloud功能因“功能崩溃”/“套接字挂断”而失败

时间:2018-04-07 13:20:51

标签: javascript firebase google-cloud-functions

我正在努力编写异步https Google Cloud功能,无论我尝试什么都失败了“功能崩溃”/“套接字挂断”。我知道我需要正确终止该功能,但我不清楚如何做到这一点,甚至是否可以使用异步https功能,尽管似乎有几个例子,我发现文档不清楚。

示例代码:

exports.asyncTest3 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => {
    Log.info("asyncTest3 start");
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            Log.info("asyncTest3 timeout");
            res.send("All done...");
            resolve();
        }, 50);
    });
});

http://localhost:5000/door-key-app/us-central1/asyncTest3给出:

{"error":{"code":500,"status":"INTERNAL","message":"function crashed","errors":["socket hang up"]}}
  • node:6.11.5
  • 纱线:1.5.1
  • firebase:4.12.1
  • firebase-tools:3.18.2
  • firebase-admin:5.12.0

替代方法似乎导致异步代码(例如Promise解决方案)被静默杀死。 E.g。

exports.asyncTest4 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => {
    Log.info("asyncTest4 start");
    res.write("starting...");
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            Log.info("asyncTest4 timeout");
            resolve();
        }, 50);
    })
    .then(function () {
        Log.info("asyncTest4 end");
        res.send("All done...");
    });
});

在浏览器中产生“starting ...”和第一条日志消息,但不会产生后续消息。

1 个答案:

答案 0 :(得分:2)

通过HTTPS调用的云函数不是基于承诺的。当您向呼叫者发送响应时,它们会结束。

所以:

exports.asyncTest3 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => {
    setTimeout(function () {
        res.send("All done...");
    }, 50);
});

看到Firebase documentation on terminating a HTTP function