在对客户端执行响应之前执行Express中间件

时间:2015-01-11 08:52:11

标签: node.js express

我需要修改模块发送给客户端的响应数据,因为模块使用res.send我似乎无法找到一种方法让我在它之前修改数据对客户进行了。

是否有任何类型的中间件/事件可用于捕获res.send并在数据执行之前修改数据?

我知道router.use存在,但它在router.post函数之前调用,而不是在res.send发送到客户端之前调用。所以我需要某种中间件,它在router.post函数完成之后但在将任何内容发送给客户端之前调用。

3 个答案:

答案 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');       });       下一个(); });