如何实际拦截res.render

时间:2013-02-13 12:05:51

标签: javascript node.js express

我想拦截每个渲染的调用,做我自己的东西,然后继续使用原始的渲染方法。我知道这可以通过这样的中间件轻松完成:

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

然而,仅更改响应对象的原型而不是在每个请求上替换res.render似乎更有效。我试过such a solution没有成功。记录http.ServerResponse.prototype时,没有任何渲染方法的痕迹。

最后我试图直接拦截app.render,就像这样:

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

这确实符合我只做一次的标准,但是它在app对象上调用而不是res对象,这意味着我无法访问res或req对象。

基本上我认为我想做的是:

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

任何想法如何实现?

1 个答案:

答案 0 :(得分:3)

我猜这取决于Express版本。试试3.x:

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

var _render = response.render;
response.render = function( ) {
    // do your stuff
    _render.apply( this, arguments );
};