我正在努力编写异步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"]}}
替代方法似乎导致异步代码(例如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 ...”和第一条日志消息,但不会产生后续消息。
答案 0 :(得分:2)
通过HTTPS调用的云函数不是基于承诺的。当您向呼叫者发送响应时,它们会结束。
所以:
exports.asyncTest3 = Functions.https.onRequest((req: Functions.Request, res: Functions.Response) => {
setTimeout(function () {
res.send("All done...");
}, 50);
});