2012-03-27 10 views
25

レスポンスボディを変更するミドルウェア機能を使用したいと考えています。ミドルウェアを接続またはエクスプレスしてレスポンスを変更してください。

これは高速サーバー用です。私が聞くためにどのようなイベントを理解していない

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

    next(); 
} 

express.use(modify); 

:よう

何か。どんなヘルプやドキュメントもありがたいです。

答えて

17

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

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

    next(); 
} 

そしてuse、それはあなたの後useルータ作ります。すべてのあなたのルートが実行された後で、あなたはボディを変更することができます

+5

私はルータの後にミドルウェアを使用しようとしていますが、まったくトリガーされていないようです。 app.routerの前に使用する場合にのみトリガされます。私はそれが何か違いがあれば、それはapp.configureブロックをinsite使用しています。 – ragulka

+3

あなたのルートで 'next'を呼び出すことを確認してください。そうしないと、Expressはそのルートの後にミドルウェアを実行しません。 –

+6

Express 4のアップデートがありますか? – gustavohenke

15

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

3

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

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

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

3

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

const mung = require('express-mung') 

module.exports = mung.json(body => body.modifiedBy = 'me'); 
関連する問題