firebase - 通过 Firebase 托管代理的 Https 函数的网关超时

标签 firebase google-cloud-functions firebase-hosting

问题:

我们使用的 Https 函数响应时间超过 60 秒(这是我们用例的必要要求,不能用异步执行代替)。我们配置了函数超时,以便它们在例如之后成功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-aliveKeep-Alive: timeout=120客户端请求中的 header ,但这似乎对托管代理没有任何影响;或者我们做得不对。
  • 目前唯一的解决方法是不使用重写规则,而是依靠“直接”URL(来自 cloudfunctions.net)。然而,这需要在浏览器客户端中处理 CORS,更重要的是,改变我们的 URL 解析方案和函数代码的组织(例如,我们不能为每个函数使用长路径,例如 /api/some/path/to/test,因为只有第一部分路径,例如 api ,将被视为函数名称)。

  • 谢谢!

    最佳答案

    可以以维护持久连接的方式编写函数:

    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();
    });
    

    关于firebase - 通过 Firebase 托管代理的 Https 函数的网关超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50519766/

    相关文章:

    typescript - 如何使用typescript在云功能中使用admin sdk从firebase读取数据

    google-cloud-platform - 如何让 Google Cloud Functions 保持温暖?

    Firebase Deploy 不更新内容

    firebase - Gradle:Flutter升级后,assembleDebug任务失败

    javascript - Firebase Cloud 函数更新数据库中的所有条目

    java - 如何使简单用户仅使用用户名登录(firebase)

    node.js - 查询后Firebase管理数据库快照数据?

    firebase-hosting - Firebase托管和仅部署新的/更改的/触摸过的文件

    android - 任务 ':app:transformClassesWithDexBuilderForDebug'的执行失败。 >无法在Android Studio中为文件创建MD5哈希(Flutter)

    javascript - Firebase 的云功能 - 将 FCM 消息发送到多个 token