执行耗时60006毫秒,完成状态:'超时'

时间:2018-06-19 00:04:39

标签: node.js firebase google-cloud-functions

如果你在本地运行这样一个简单的例子:

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)

1 个答案:

答案 0 :(得分:4)

所有已部署功能的default timeout为60秒。当功能超时持续时间过去时,云功能将限制您的功能上的资源,导致它终止,并将该错误留在您的日志中。

您可以在Cloud控制台中配置Firebase CLI部署的功能的超时(不在Firebase控制台中,当前不在CLI中)。 maximum timeout为540秒(9分钟)。

此外,您的函数中可能存在一个重要错误,可能会使其行为与您预期的不同。您正在从runTimeout返回一个promise,它在任何情况下都会阻止后续行(res.send)执行。如果你没有向客户端发送响应,你的函数也会超时,因为发送的响应标志着你的函数执行结束。