Javascript 异步https Firebase Google云功能失败,返回“0”;函数崩溃";/&引用;“插座挂起”;

Javascript 异步https Firebase Google云功能失败,返回“0”;函数崩溃";/&引用;“插座挂起”;,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我正在努力编写一个异步https谷歌云函数,无论我尝试什么,都会因“函数崩溃”/“套接字挂起”而失败。我知道我需要正确终止函数,但我不清楚如何终止,甚至不清楚是否可以使用异步https函数,尽管似乎有几个例子,而且我发现文档不清楚 示例代码: exports.asyncTest3 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => { Log.info("asyncTest

我正在努力编写一个异步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);
    });
});
给出:

  • 节点:6.11.5
  • 纱线:1.5.1
  • 火基:4.12.1
  • firebase工具:3.18.2
  • firebase管理员:5.12.0

另一种方法似乎会导致异步代码(例如承诺解析)被静默终止。例如

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

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

通过HTTPS调用的云函数不是基于承诺的。而是在您向调用方发送响应时结束

因此:


可以看到通过HTTPS调用的。

云函数不是基于承诺的。而是在您向调用方发送响应时结束

因此:


参见。

替代方法似乎会导致异步代码(例如承诺解析)被静默终止。例如,替代方法似乎会导致异步代码(例如承诺解析)被静默终止。例如,感谢您尝试提供帮助,但您给出的代码示例以与上面相同的方式崩溃。我不确定您所说的“…不基于承诺”是什么意思-承诺只是管理异步逻辑的一种方法。因此,我看不出我的示例与您的示例有任何实质性的区别。不需要从HTTPS触发的云函数返回
承诺。我共享的代码将在50ms后发送响应,然后终止函数。如果没有其他问题,那么我的答案中的代码以相同的方式显示您不需要返回承诺。好的,我同意没有必要或没有必要从函数中返回承诺,我的问题是所有这些代码示例对我来说都崩溃了(在本地测试,使用
纱线运行服务
),虽然听起来他们在为你和其他人工作??!!好啊我会专注于这一点,而不是承诺。如果您删除
setTimeout()
并立即发送响应,是否也会出现问题?感谢您的帮助,但是您给出的代码示例以与上面相同的方式崩溃。我不确定您所说的“…不基于承诺”-承诺只是管理异步逻辑的一种方法。因此,我看不出我的示例与您的示例有任何实质性的区别。不需要从HTTPS触发的云函数返回
承诺。我共享的代码将在50ms后发送响应,然后终止函数。如果没有其他问题,那么我的答案中的代码以相同的方式显示您不需要返回承诺。好的,我同意没有必要或没有必要从函数中返回承诺,我的问题是所有这些代码示例对我来说都崩溃了(在本地测试,使用
纱线运行服务
),虽然听起来他们在为你和其他人工作??!!好啊我会专注于这一点,而不是承诺。如果删除
setTimeout()
并立即发送响应,是否也会出现问题?
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...");
    });
});
exports.asyncTest3 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => {
    setTimeout(function () {
        res.send("All done...");
    }, 50);
});