【问题标题】:Async https Firebase Google Cloud Function fails with "function crashed" / "socket hang up"异步 https Firebase Google Cloud 功能因“功能崩溃”/“套接字挂起”而失败
【发布时间】:2018-09-17 08:49:22
【问题描述】:

我正在努力编写异步 https 谷歌云函数,无论我尝试什么都失败了,“函数崩溃”/“套接字挂断”。我知道我需要正确终止该功能,但我不清楚如何执行此操作,甚至不清楚是否可以使用异步 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"]}}
  • 节点:6.11.5
  • 纱线:1.5.1
  • 火力基地:4.12.1
  • firebase 工具:3.18.2
  • firebase 管理员:5.12.0

替代方法似乎会导致异步代码(例如 Promise 解析)被静默杀死。例如

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

在浏览器中产生“开始...”,以及第一条日志消息,但不是后续消息。

【问题讨论】:

  • 替代方法似乎会导致异步代码(例如 Promise 解析)被静默杀死。例如

标签: javascript firebase google-cloud-functions


【解决方案1】:

通过 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

【讨论】:

  • 感谢您的帮助,但您提供的代码示例以与上述相同的方式为我崩溃。
  • 我不确定您所说的“......不是基于承诺的”是什么意思 - Promise 只是管理异步逻辑的一种手段。因此,我看不出我的例子和你的例子有什么实质性的区别。
  • 无需从 HTTPS 触发的云函数返回 Promise。我分享的代码将在 50 毫秒后发送响应,然后终止函数。如果不出意外,我的答案中的代码以同样的方式表明您不需要返回承诺。
  • 好的,同意没有必要或指向从函数返回 Promise,我的问题是所有这些代码示例对我来说都崩溃了(在本地测试,使用 yarn run serve),而它听起来他们在为你和其他人工作??!!
  • 好的。我会专注于这一点,而不是承诺。如果您删除setTimeout() 并立即发送回复,是否也会出现此问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多