1

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

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

这确实符合我只执行一次的标准,它是在 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);
};

任何想法如何实现这一目标?

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 回答