Javascript 异步https Firebase Google云功能失败,返回“0”;函数崩溃";/&引用;“插座挂起”;
我正在努力编写一个异步https谷歌云函数,无论我尝试什么,都会因“函数崩溃”/“套接字挂起”而失败。我知道我需要正确终止函数,但我不清楚如何终止,甚至不清楚是否可以使用异步https函数,尽管似乎有几个例子,而且我发现文档不清楚 示例代码: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
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);
});