我需要修改模块发送给客户端的响应数据,因为模块使用res.send
我似乎无法找到一种方法让我在它之前修改数据对客户进行了。
是否有任何类型的中间件/事件可用于捕获res.send
并在数据执行之前修改数据?
我知道router.use
存在,但它在router.post
函数之前调用,而不是在res.send
发送到客户端之前调用。所以我需要某种中间件,它在router.post
函数完成之后但在将任何内容发送给客户端之前调用。
答案 0 :(得分:11)
你可以覆盖发送功能:
app.use(function (req, res) {
var send = res.send;
res.send = function (body) { // It might be a little tricky here, because send supports a variety of arguments, and you have to make sure you support all of them!
// Do something with the body...
send.call(this, body);
};
});
如果您想支持的不只是调用send
(比如调用end
方法),那么您必须覆盖更多功能......
您可以查看connect-livereload如何将脚本添加到任何html输出中。
答案 1 :(得分:0)
您缺少代码使得回答您的问题变得非常困难,但您可以使用类似
的内容Express 4.0:
router.use('/path', function (req, res) {
// Modify req
});
路线上的 .use
将在继续实际路线之前对其进行解析,因此,如果某人提交了某个表单或其他内容,则会在.use
之前点击.post
或.get
或者你可以做到
Express 4.0:
app.use(function (req, res) {
// Modify Req
if (req.body.hasOwnProperty('some_form_name')) {
// Do Somthing
}
});
这是相同的事情,但它会在每个路由的每个请求之前被调用。
不确定这是否可以回答您的问题,但我认为这可能是您正在寻找的内容?
答案 2 :(得分:0)
https://community.apigee.com/questions/12183/usage-of-middleware-after-response-sent.html
expressApp.use(function(req,res,next){ req.on(“end”,function(){ console.log('on request end'); }); 下一个(); });