1

私のコード:

timeout = require('connect-timeout')

app.get('/', timeout('5s'), function(req, res){
  ##DO SOMETHING 1
  ##DO SOMETHING 2
  ##DO SOMETHING 3
  res.send('ok'); ##line 7
});

ユーザーが要求したとき。Node.js は「DO SOMETHING1-3」を処理します。しかし、それは処理する前に。5 秒に設定されているため、ミドルウェアの応答がタイムアウトします。その後、7 行目のルーティングで再度応答を試みます。そして、その原因は「送信後にヘッダーを設定できません」というエラーです。

問題を処理する方法?

4

1 に答える 1

2

これはよくある問題だと感じたので、GitHub リポジトリを検索したところ、この問題が見つかりました。

この回答では、上でリンクした問題で提案されている 2 つの解決策の概要を説明します。

  1. req.timedoutを呼び出す前に、プロパティを介してリクエストがタイムアウトしたかどうかを確認できますres.send

    app.get('/', timeout('5s'), function(req, res){
      ##DO SOMETHING 1
      ##DO SOMETHING 2
      ##DO SOMETHING 3
      if (!req.timedout) {
        res.send('ok'); ##line 7
      }
    });
    
  2. または、エラーを効果的に抑制するトップレベルのミドルウェアをマウントすることもできます。

    app.use(function(req,res,next){
      var _send = res.send;
      var sent = false;
      res.send = function(data){
          if(sent) return;
          _send.bind(res)(data);
          sent = true;
      };
      next();
    });
    
于 2015-10-14T09:36:19.020 に答える