1

render のすべての呼び出しをインターセプトし、独自の処理を行ってから、元の render メソッドに進みたいと考えています。これは、次のようなミドルウェアを使用して簡単に実行できることを知っています。

function (req, res, next) {
  var _render = render;
  res.render = function () {
    // custom stuff
    _render.apply(this, arguments);
  }
  next();
}

ただし、すべてのリクエストで res.render を置き換えるのではなく、レスポンス オブジェクトのプロトタイプを変更するだけの方が効率的です。私はそのような解決策を試みましたが、成功しませんでした。ログhttp.ServerResponse.prototypeに記録すると、レンダリング メソッドの痕跡はありません。

最後に、次のように代わりに app.render をインターセプトしようとしました:

var _render = app.render;
app.render = function () {
  // this is refering to app instead of res...
  _render.apply(this, arguments);
}

これは、一度だけ実行するという私の基準を満たしていますが、 res オブジェクトではなく app オブジェクトで呼び出されるため、 res または req オブジェクトにアクセスできません。

基本的に私がやりたいと思うことは次のようなものです:

var _render = something.response.render;
something.response.render = function (view, data, callback) {
  // Access res.*, as this.*
  _render.call(this, view, data, callback);
};

それを達成する方法はありますか?

4

1 に答える 1

3

Expressのバージョンにもよると思います。3.xでこれを試してください:

var response = require( "express" ).response;

var _render = response.render;
response.render = function( ) {
    // do your stuff
    _render.apply( this, arguments );
};
于 2013-02-13T12:48:33.543 に答える