如何实际拦截res.render

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

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

但是,更改响应对象的原型似乎更有效,而不是在每个请求中都replaceres.render。 我试过这样一个解决scheme ,但没有成功。 当logginghttp.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); }; 

任何想法如何实现?

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

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