2012-03-27 132 views
25

我想要一个修改响应正文的中间件功能。连接或Express中间件来修改response.body

这是一个快速服务器。

喜欢的东西:

function modify(req, res, next){ 
    res.on('send', function(){ 
    res.body = res.body + "modified" 
    }); 

    next(); 
} 

express.use(modify); 

我不明白,听什么事件。任何帮助或文件将不胜感激。

回答

17

你不需要听任何事件。只是使它后

function modify(req, res, next){ 
    res.body = res.body + "modified"; 

    next(); 
} 

而且use它,你use路由器。通过这种方式完成所有路由后,您可以修改主体

+5

我想在路由器后使用我的中间件,但它似乎根本没有触发。只有在app.router之前使用它才会被触发。我将它用于app.configure块,如果这有什么区别的话。 – ragulka 2012-10-24 21:02:45

+3

确保您在路由中调用'next',否则express将不会在该路由后执行任何中间件 – 2013-09-29 15:27:55

+6

您对Express 4有更新的答案吗? – gustavohenke 2015-08-01 04:51:59

15

我相信,OP实际上想要在中间件处理请求后修改响应流。查看捆绑的Compress中间件实现,了解如何完成这个过程。连接猴子补丁ServerResponse原型,当writeHead被调用时,但在它完成之前发出header事件。

3

覆盖响应的write方法似乎适用于我的Express 4.这允许修改响应的身体,即使它是一个流。

app.use(function (req, res, next) { 
    var write = res.write; 
    res.write = function (chunk) { 
    if (~res.getHeader('Content-Type').indexOf('text/html')) { 
     chunk instanceof Buffer && (chunk = chunk.toString()); 
     chunk = chunk.replace(/(<\/body>)/, "<script>alert('hi')</script>\n\n$1"); 
     res.setHeader('Content-Length', chunk.length); 
    } 
    write.apply(this, arguments); 
    }; 
    next(); 
}); 

只要确保可以修改响应的任何其他中间件之前注册这个中间件。

3

express-mung是为此设计的。它只是更多的中间件而不是事件。你的例子看起来像

const mung = require('express-mung') 

module.exports = mung.json(body => body.modifiedBy = 'me');