对客户端进行响应前的Express中间件

Express middleware before response is carried out to client

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

是否有任何类型的 middleware/event 可用于捕获 res.send 并在其执行前修改数据?

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

您缺少代码,因此很难回答您的问题,但您可以使用

Express 4.0:
router.use('/path', function (req, res) {
    // Modify req
});
路线上的 [​​=21=].use 将在继续实际路线之前对其进行解析,因此如果有人提交了表单或其他内容,它将在进入 [=14= 之前点击 .use ] 或 .get

或者你也可以

Express 4.0:
app.use(function (req, res) {
    // Modify Req
    if (req.body.hasOwnProperty('some_form_name')) {
       // Do Somthing
    }
});

这是一回事,但它会在每个路由的每个请求之前调用。

不确定这是否能回答您的问题,但我认为这可能是您要找的东西?

那么你可以覆盖发送函数:

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 输出。

来自here的另一个解决方案:

expressApp.use(function (req, res, next) {
    req.on("end", function () {
        console.log('on request end');
    });
    next();
});