web-dev-qa-db-ja.com

ミドルウェアを接続または表現して、response.bodyを変更します

応答本文を変更するミドルウェア関数が欲しいです。

これは、エクスプレスサーバー用です。

何かのようなもの:

function modify(req, res, next){
  res.on('send', function(){
    res.body = res.body + "modified"
  });

  next();
}

express.use(modify);

どのイベントをリッスンするのかわかりません。ヘルプやドキュメントをいただければ幸いです。

31
The Who

イベントを聞く必要はありません。ちょうどそれを作る

function modify(req, res, next){
  res.body = res.body + "modified";

  next();
}

そして、useルーターのuseの後。これにより、すべてのルートが実行された後、本文を変更できます

21

ミドルウェアが要求を処理した後、OPは実際に応答ストリームを変更したいと考えています。バンドルされた Compress ミドルウェア実装を見て、これがどのように行われるかの例を確認してください。 Connect monkeyは、ServerResponseプロトタイプがheaderが呼び出されたときに、完了前にwriteHeadイベントを発行するようにパッチを適用します。

17
Corey Jewett

express-mung はこのために設計されています。イベントではなく、単なるミドルウェアです。あなたの例は次のようになります

const mung = require('express-mung')

module.exports = mung.json(body => body.modifiedBy = 'me');
9

Express 4では、応答の write メソッドを上書きできるように思えました。これにより、ストリームであっても応答の本文を変更できます。

app.use(function (req, res, next) {
  var write = res.write;
  res.write = function (chunk) {
    if (~res.getHeader('Content-Type').indexOf('text/html')) {
      chunk instanceof Buffer && (chunk = chunk.toString());
      chunk = chunk.replace(/(<\/body>)/, "<script>alert('hi')</script>\n\n$1");
      res.setHeader('Content-Length', chunk.length);
    }
    write.apply(this, arguments);
  };
  next();
});

応答を変更する可能性のある他のミドルウェアの前に、このミドルウェアを必ず登録してください。

5
Peleg

これを行うためのモジュールは connect-static-transform 、チェックしてください:

https://github.com/KenPowers/connect-static-transform

静的ファイルを提供する前に変換できるようにする接続ミドルウェア。

そして、 this one のような例が付属しています。

2
Greg Slepak