如果你在本地运行这样一个简单的例子:
export async function runTimeout(req, res) {
// console.log('Request:\n\n', req);
return new Promise(async (resolve, reject) => {
await timeout(80000);
resolve();
});
res.status(200).send('Timeout complete');
}
function timeout(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
使用命令:
firebase serve --only functions
根据firebase github问题列表,你会看到每次超时60秒, localhost 的默认值现在应该是9分钟(这是最大值)所以他们不是需要配置它。有谁知道为什么我在60秒时超时而且能够完成整个80秒(如本例所示)或更多?
错误消息是:
info:执行耗时62033毫秒,完成状态:'超时'信息: 执行耗时62043毫秒,完成状态:'崩溃'错误: 这个功能出了问题!错误:错误:无法设置 发送后的标题。 在validateHeader(_http_outgoing.js:491:11) 在ServerResponse.setHeader(_http_outgoing.js:498:3) 在ServerResponse.header(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/express/lib/response.js:767:10) 在ServerResponse.send(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/express/lib/response.js:170:12) 在ServerResponse.json(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/express/lib/response.js:267:15) 在ProxyServer.Supervisor._proxy.on(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/@google-cloud/functions-emulator/src/supervisor/supervisor。 JS:107:14) 在ProxyServer.emit(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/eventemitter3/index.js:144:27) 在ClientRequest.proxyError(/Users/hackintosh/.nvm/versions/node/v8.11.2/lib/node_modules/firebase-tools/node_modules/http-proxy/lib/http-proxy/passes/web-incoming.js:156 :18) 在emitOne(events.js:116:13) 在ClientRequest.emit(events.js:211:7)
答案 0 :(得分:4)
所有已部署功能的default timeout为60秒。当功能超时持续时间过去时,云功能将限制您的功能上的资源,导致它终止,并将该错误留在您的日志中。
您可以在Cloud控制台中配置Firebase CLI部署的功能的超时(不在Firebase控制台中,当前不在CLI中)。 maximum timeout为540秒(9分钟)。
此外,您的函数中可能存在一个重要错误,可能会使其行为与您预期的不同。您正在从runTimeout返回一个promise,它在任何情况下都会阻止后续行(res.send)执行。如果你没有向客户端发送响应,你的函数也会超时,因为发送的响应标志着你的函数执行结束。