2012-03-27 13 views
25

Me gustaría tener una función de middleware que modifique el cuerpo de la respuesta.Connect o Express middleware para modificar response.body

Esto es para un servidor express.

Algo así como:

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

    next(); 
} 

express.use(modify); 

no entiendo qué evento para escuchar. Cualquier ayuda o documentación sería apreciada.

Respuesta

17

No necesita escuchar ningún evento. Sólo lo hacen

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

    next(); 
} 

Y use despues de hacer use el router. De esta manera, después de que todas sus rutas se hayan ejecutado, puede modificar el cuerpo

+5

Estoy tratando de usar mi middleware después del enrutador, pero parece que no se activó en absoluto. Solo se activa si lo uso antes de app.router. Lo estoy usando en el bloque app.configure, si eso hace alguna diferencia. – ragulka

+3

Asegúrese de estar llamando 'next' en sus rutas; de lo contrario, express no ejecutará ningún middleware después de esa ruta –

+6

¿Tiene alguna respuesta actualizada para Express 4? – gustavohenke

15

Creo que el OP realmente desea modificar el flujo de respuesta una vez que un middleware ha manejado la solicitud. Consulte la implementación de middleware Compress para ver un ejemplo de cómo se hace esto. Conecte mono parches el prototipo ServerResponse para emitir el evento header cuando se invoca writeHead, pero antes de que se complete.

3

Sobrescribir el método write de la respuesta pareció funcionar para mí con Express 4. Esto permite modificar el cuerpo de la respuesta incluso cuando se trata de una transmisión.

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

Solo asegúrese de registrar este middleware antes que cualquier otro middleware que pueda estar modificando la respuesta.

3

express-mung está diseñado para esto. En lugar de eventos, solo hay más middleware. Su ejemplo sería algo así como

const mung = require('express-mung') 

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