我们正在使用花费超过60秒的Https函数来响应(这是我们用例的必要条件,不能用异步执行代替)。我们将函数配置为超时,以便它们在例如75秒,如通过Chrome或Postman直接执行,例如https://us-central1-<project-id>.cloudfunctions.net/test
。
我们还配置了托管代理,以便将/api
的所有请求重写为这些功能。但是,当通过这些“托管”端点(例如https://<project-id>.firebaseapp.com/api/test
)提交相同的请求时,我们会在Chrome和Postman中仅在60秒后收到504(网关超时)错误。这表明托管代理本身超时 功能成功( 仍然会发生,如Firebase控制台日志中所示)。
是否可以将主机超时设置为更高的值(例如120秒)?
Connection: keep-alive
和Keep-Alive: timeout=120
标头,但这似乎对托管代理没有任何影响;或许我们做得不对。cloudfunctions.net
)。但是,这需要在浏览器客户端中处理CORS,更重要的是,更改我们的URL解析方案和函数代码的组织(例如,我们不能为每个函数使用长路径,例如/api/some/path/to/test
,因为只有第一部分该路径(例如api
)将被视为函数名称。谢谢!
答案 0 :(得分:0)
可以以保持持久连接的方式编写函数:
https://firebase.google.com/docs/functions/networking#https_requests
const http = require('http');
const functions = require('firebase-functions');
const agent = new http.Agent({keepAlive: true});
exports.function = functions.https.onRequest((request, response) => {
req = http.request({
host: '',
port: 80,
path: '',
method: 'GET',
agent: agent,
}, res => {
let rawData = '';
res.setEncoding('utf8');
res.on('data', chunk => { rawData += chunk; });
res.on('end', () => {
response.status(200).send(`Data: ${rawData}`);
});
});
req.on('error', e => {
response.status(500).send(`Error: ${e.message}`);
});
req.end();
});
答案 1 :(得分:0)
刚刚遇到了一个与我的 API 端点(通过 Firebase 托管连接)的 Cloud Scheduler 作业相同的问题。大约需要 80 秒才能完成。
但似乎没有解决方法。至少在使用 Firebase 托管时不会。也许您可以直接点击函数的 URL,而不是通过 Firebase 托管。但是,如果这些请求来自浏览器,则您必须处理配置 CORS。
发件人: https://firebase.google.com/docs/hosting/functions
文字版:
<块引用>注意:Firebase 托管受 60 秒请求超时的影响。即使您将 HTTPS 函数配置为更长的请求超时,如果您的函数需要超过 60 秒的运行时间,您仍会收到 HTTPS 状态代码 504(请求超时)。要支持需要较长计算时间的动态内容,请考虑使用 App Engine 柔性环境。