Подтвердить что ты не робот

Подключить или выполнить промежуточное ПО для изменения ответа.

Я хотел бы иметь функцию промежуточного программного обеспечения, которая модифицирует тело ответа.

Это для экспресс-сервера.

Что-то вроде:

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

  next();
}

express.use(modify);

Я не понимаю, какое событие слушать. Любая помощь или документация были бы оценены.

4b9b3361

Ответ 1

Вам не нужно слушать какие-либо события. Просто сделайте это

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

  next();
}

И use после use маршрутизатора. Таким образом, после выполнения всех ваших маршрутов вы можете изменить тело

Ответ 2

Я считаю, что OP фактически хочет изменить поток ответов, когда промежуточное программное обеспечение обработало запрос. Посмотрите на прилагаемую Compress промежуточную реализацию для примера того, как это делается. Connect monkey исправляет прототип ServerResponse, чтобы выпустить событие header, когда вызывается writeHead, но до его завершения.

Ответ 3

Завершение ответа write, похоже, работало для меня с помощью Express 4. Это позволяет модифицировать тело ответа, даже когда оно является потоком.

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();
});

Просто убедитесь, что зарегистрировали это промежуточное программное обеспечение перед любым другим промежуточным программным обеспечением, которое может изменять ответ.

Ответ 4

express-mung предназначен для этого. Вместо событий это просто больше промежуточного ПО. Ваш пример будет выглядеть примерно так:

const mung = require('express-mung')

module.exports = mung.json(body => body.modifiedBy = 'me');

Ответ 5

Кажется, существует модуль для выполнения этого connect-static-transform, проверьте его:

https://github.com/KenPowers/connect-static-transform

Соединение промежуточного программного обеспечения, которое позволяет преобразовывать статические файлы перед их обслуживанием.

И он поставляется с примерами, например этот.