web-dev-qa-db-ja.com

Express.js応答タイムアウト

問題

Express.jsのリクエスト/レスポンスタイムアウトを探していましたが、リクエスト/レスポンス自体ではなく、すべてが接続に関連しているようです。

リクエストに時間がかかっている場合は、タイムアウトする必要があります。当然、これは起こるべきではありませんが、コールバックへの呼び出しがない、またはres.send()がないルートハンドラーがあるという単純な間違いでさえ、ブラウザーは永遠に応答を待ち続けます。

空のルートハンドラは、この完璧な例です。

app.get('/sessions/', function(req, res, callback){});

修正

次のbeforeapp.use(app,router);を追加しましたが、タイムアウト機能が追加されたようです。誰にもこれに関する経験/意見はありますか?

app.use(function(req, res, next){
    res.setTimeout(120000, function(){
        console.log('Request has timed out.');
            res.send(408);
        });

    next();
});

タイムアウトを2分に設定していることに注意してください。

54
Xerri

タイムアウトサポート用のConnectミドルウェアはすでにあります。

var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4

app.use(timeout(120000));
app.use(haltOnTimedout);

function haltOnTimedout(req, res, next){
  if (!req.timedout) next();
}

上記のようにタイムアウトミドルウェアをトップレベルミドルウェアとして使用する予定がある場合、haltOnTimedOutミドルウェアはスタックで定義された最後のミドルウェアである必要があり、タイムアウトイベントをキャッチするために使用されます。更新してくれて@Aichholzerに感謝します。

サイドノート:

独自のタイムアウトミドルウェアを使用する場合、4xxステータスコードはクライアントエラー用で、5xxはサーバーエラー用です。 408は次の場合に予約されています。

クライアントは、サーバーが待機する準備ができている時間内に要求を生成しませんでした。クライアントは、後で修正せずにリクエストを繰り返すことができます。

65
srquinn

Express 4.2を使用している場合の更新。タイムアウトミドルウェアは削除されているため、手動で追加する必要があります。

npm install connect-timeout

そして、コード内にある必要があります(コメントごとに編集、コードに含める方法)

 var timeout = require('connect-timeout');
 app.use(timeout('100s'));
27
V31

これを行うために他のnpmモジュールは必要ありません

var server = app.listen();
server.setTimeout(500000);

https://github.com/expressjs/express/issues/33 に触発された

または

app.use(function(req, res, next){
res.setTimeout(500000, function(){
        // call back function is called when request timed out.
    });
    next();
});
12

request.setTimeout(< time in milliseconds >)は仕事をします

https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback

1
rahul shukla