2013-02-13 89 views
1

我想拦截每个调用渲染,做我自己的东西,然后继续原始的渲染方法。我知道这可以很容易地通过一个中间件就像这样:如何实际拦截res.render

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

这确实满足只被执行一次的我的标准,它被称为应用程序对象上,而不是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); 
}; 

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

回答

3

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

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

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

嘿,应该试过。奇迹般有效。谢谢! – 2013-02-13 18:30:10