连接或Express中间件以修改response.body

The*_*Who 31 connect node.js express

我想有一个中间件函数来修改响应体.

这是一个快速服务器.

就像是:

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

  next();
}

express.use(modify);
Run Code Online (Sandbox Code Playgroud)

我不明白要听什么事.任何帮助或文档将不胜感激.

Chr*_*ini 23

你不需要听任何事件.做吧

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

  next();
}
Run Code Online (Sandbox Code Playgroud)

use之后你把它use的路由器.这样,在所有路线执行完毕后,您可以修改主体

  • 你有快递4的最新答案吗? (10认同)
  • 确保你在路由中调用`next`,否则express将不会在该路由后执行任何中间件 (6认同)
  • 我试图在路由器之后使用我的中间件,但它似乎根本没有触发.只有在app.router之前使用它才会触发它.我正在使用它insite app.configure块,如果这有任何区别. (5认同)

小智 17

我相信OP实际上想要在中间件处理请求后修改响应流.查看捆绑的Compress中间件实现,以获取如何完成此操作的示例.连接猴子补丁ServerResponse原型,headerwriteHead调用时但在完成之前发出事件.


Ric*_*der 9

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

const mung = require('express-mung')

module.exports = mung.json(body => body.modifiedBy = 'me');
Run Code Online (Sandbox Code Playgroud)


Pel*_*leg 5

对于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();
});
Run Code Online (Sandbox Code Playgroud)

只需确保先注册此中间件,然后再注册其他任何可能正在修改响应的中间件。

  • 为了简化你的答案,而不是 `~res.getHeader('Content-Type').indexOf('text/html')` 你可以使用 `res.getHeader('Content-Type').indexOf('text/ html') &gt; -1` (3认同)