bugfix> firebase > 投稿
問題:

応答に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 Consoleログに示されているように、引き続き発生します)。

質問:

ホスティングタイムアウトをより高い値(120秒など)に設定することはできますか?

考えられる解決策/回避策:
  • Connection: keep-alive を設定しようとしましたおよび Keep-Alive: timeout=120 クライアントリクエストのヘッダー。ただし、これはホスティングプロキシに影響を与えないようです。または多分私達はそれを正しくしていない。
  • 現時点での唯一の回避策は、書き換えルールを使用せず、代わりに「直接」URL( cloudfunctions.net から) )。ただし、ブラウザクライアントでCORSを処理し、さらに重要なことには、URL解決スキームと関数のコードの構成を変更する必要があります(たとえば、 /api/some/path/to/test などの各関数に長いパスを使用することはできません) 、そのパスの最初の部分のみ( api など) 、関数名と見なされます)。

ありがとう!

回答 1 件
  • 永続的な接続を維持するような方法で関数を書くことができます:

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

あなたの答え