【发布时间】:2012-04-11 09:40:11
【问题描述】:
我想要一个修改响应正文的中间件函数。
这是一个快速服务器。
类似:
function modify(req, res, next){
res.on('send', function(){
res.body = res.body + "modified"
});
next();
}
express.use(modify);
我不明白要听什么事件。任何帮助或文档将不胜感激。
【问题讨论】:
我想要一个修改响应正文的中间件函数。
这是一个快速服务器。
类似:
function modify(req, res, next){
res.on('send', function(){
res.body = res.body + "modified"
});
next();
}
express.use(modify);
我不明白要听什么事件。任何帮助或文档将不胜感激。
【问题讨论】:
express-mung 就是为此而设计的。而不是事件,它只是更多的中间件。你的例子看起来像
const mung = require('express-mung')
module.exports = mung.json(body => body.modifiedBy = 'me');
【讨论】:
用 Express 4 覆盖响应的 write 方法似乎对我有用。这允许修改响应的主体,即使它是流。
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();
});
只需确保在任何其他可能修改响应的中间件之前注册此中间件即可。
【讨论】:
~res.getHeader('Content-Type').indexOf('text/html'),你可以使用res.getHeader('Content-Type').indexOf('text/html') > -1
似乎有一个名为 connect-static-transform 的模块可以执行此操作,请查看:
https://github.com/KenPowers/connect-static-transform
一个连接中间件,允许在提供静态文件之前对其进行转换。
它带有示例,例如this one。
【讨论】:
transform 回调没有收到来自中间件链的req 和res 参数。
我相信一旦中间件处理了请求,OP 实际上想要修改响应流。查看捆绑的 Compress 中间件实现,了解如何完成此操作的示例。 Connect Monkey 修补 ServerResponse 原型,以在调用 writeHead 时但在它完成之前发出 header 事件。
【讨论】:
您不需要监听任何事件。做就行了
function modify(req, res, next){
res.body = res.body + "modified";
next();
}
然后use 在你use 路由器之后。这样,在您执行完所有路线后,您可以修改正文
【讨论】:
next,否则 express 不会在该路由之后执行任何中间件
use路由器之后”?在带有app.get(someRoute, handler)s 和app.listen(port, anotherHandler 的简单应用程序中,我必须在app.use(modify) 之后app.listen 吗?对我来说之前和之后似乎都不起作用(我添加了app.use((req, res, next) => { console.log('after response'); next(); })并且在控制台中看不到任何内容..