web-dev-qa-db-fra.com

Connectez ou middleware Express pour modifier la réponse.

J'aimerais avoir une fonction middleware qui modifie le corps de réponse.

C'est pour un serveur express.

Quelque chose comme:

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

  next();
}

express.use(modify);

Je ne comprends pas quel événement écouter. Toute aide ou documentation serait appréciée.

31
The Who

Vous n'avez pas besoin d'écouter les événements. Faites-le

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

  next();
}

Et use après vous use le routeur. De cette façon, une fois tous vos itinéraires exécutés, vous pouvez modifier le corps

21

Je pense que l'OP souhaite réellement modifier le flux de réponse une fois qu'un middleware a traité la demande. Regardez l'implémentation du middleware Compress fourni pour un exemple de la façon dont cela est fait. Connect monkey corrige le prototype ServerResponse pour émettre l'événement header lorsque writeHead est appelé, mais avant qu'il ne soit terminé.

17
Corey Jewett

express-mung est conçu pour cela. Au lieu d'événements, c'est juste un middleware. Votre exemple ressemblerait à quelque chose

const mung = require('express-mung')

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

L'écrasement de la méthode write de la réponse semblait fonctionner pour moi avec Express 4. Cela permet de modifier le corps de la réponse même s'il s'agit d'un flux.

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

Assurez-vous simplement d'enregistrer ce middleware avant tout autre middleware susceptible de modifier la réponse.

5
Peleg

Il semble y avoir un module pour ce faire appelé connect-static-transform , vérifiez-le:

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

Un middleware de connexion qui permet de transformer des fichiers statiques avant de les servir.

Et il est livré avec des exemples, comme celui-ci .

2
Greg Slepak