40

存在する場合、応答の「終了」イベントにリスナーを設定する高速ミドルウェア関数を書きたいと思います。目的は、終了ハンドラーが送信することを決定した http 応答コードに基づいてクリーンアップを行うことです。たとえば、応答コードのログ記録や、db トランザクションのロールバック/コミットなどです。つまり、このクリーンアップをエンド コーラーに透過的にしたいのです。

私はエクスプレスで次のようなことをしたいと思います:

ルートミドルウェア

function (req, res, next) {
   res.on ('end', function () {
      // log the response code and handle db
      if (res.statusCode < 400) { db.commit() } else { db.rollback() }
   });
   next();
}

ルート:

app.post ("/something", function (req, res) { 
    db.doSomething (function () {
       if (some problem) {
          res.send (500);
       } else {
          res.send (200);
       }
    });
 }

これを試してみると、「終了」イベント ハンドラが呼び出されません。res.on('close')別の投稿で読んだ についても同じです。そのようなイベントは発生しますか?

これを行う唯一の方法は、ラッピングres.endするかres.send、カスタム ミドルウェアで独自のバージョンを使用することです。これは理想的ではres.endありres.sendません。コールバックを使用しないため、それらをラップして元のコードを呼び出してから、コールバックされたときに設定された応答コードに基づいて自分のことを行うことはできません (コールしないため)。私に戻る)。

これを行う簡単な方法はありますか?

4

3 に答える 3

48

奇妙なことに、応答が閉じられると、応答は「終了」イベントを発行するようです: https://web.archive.org/web/20120825112648/http://sambro.is-super-awesome.com/2011/ 06/27/listening-for-end-of-response-with-nodeexpress-js/

このブログ エントリは少し古いですが、このイベントはまだ存在します ( lib/http.js の 836 行目) ため、node のドキュメントにも Express のドキュメントにも記載されていませんが、すぐには消えないと思います。2014 年初頭までに、lib/_http_outgoing.js の 504 行目に移動し、引き続き機能します。

ところで、サーバー応答の「エラー」イベントは、通常は見たいものではないでしょう。

于 2012-08-07T08:21:19.447 に答える
41

@Amatsuyu の応答をさらに進めるために、次のように表示されます。

res.on('finish', function() {
  // do stuff here
});
于 2016-06-27T15:12:25.447 に答える
0

ドキュメントを読むと、署名は次のres.sendとおりです。

res.send(body|status[, headers|status[, status]])

つまり、次のように独自のステータスを設定できることを意味します:res.send( 'some string', 200 );または単にres.send( 404 );.

このメソッドは、応答を送信するために使用するメソッドです。

クライアントに送信されると、もうアクセスできないため、コールバックはありません。

これは、サーバーが行う最後のことです。リクエストを処理したら、レスポンスを送信します。

ただし、クライアントに送信する前にアクセスできます。つまり、次のことができます。

console.log( res );
res.send( datas );

ロールバック/コミットする場合は、応答がなくなったときではなく、データベースのコールバックが呼び出されたときに実行します。

于 2012-06-21T14:21:28.620 に答える