2012-03-27 15 views
25

Mi piacerebbe avere una funzione middleware che modifica il corpo della risposta.middleware Connect o Express per modificare il response.body

Questo è per un server espresso.

Qualcosa di simile:

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

    next(); 
} 

express.use(modify); 

non capisco quale evento da ascoltare per. Qualsiasi aiuto o documentazione sarebbe gradito.

risposta

17

Non è necessario ascoltare eventi. Basta fare

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

    next(); 
} 

E use un commento dopo aver use il router. In questo modo, dopo aver eseguito tutti i percorsi, è possibile modificare il corpo

+5

Sto cercando di utilizzare il mio middleware dopo il router, ma sembra non essere attivato. Viene attivato solo se lo utilizzo prima di app.router. Sto usando insita il blocco app.configure, se questo fa alcuna differenza. – ragulka

+3

Assicurati di aver chiamato 'next' nei tuoi percorsi, altrimenti express non eseguirà alcun middleware dopo quella rotta –

+6

Hai una risposta aggiornata per Express 4? – gustavohenke

15

Credo che l'OP voglia effettivamente modificare il flusso di risposta una volta che un middleware ha gestito la richiesta. Guarda l'implementazione del middleware Compress in dotazione per un esempio di come è fatto. Connetti patch scimmia il prototipo ServerResponse per emettere l'evento header quando viene chiamato writeHead, ma prima che sia completato.

3

La sovrascrittura del metodo write della risposta sembrava funzionare con Express 4. Ciò consente di modificare il corpo della risposta anche quando si tratta di un flusso.

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

Assicurati di registrare questo middleware prima di qualsiasi altro middleware che potrebbe modificare la risposta.

3

express-mung è progettato per questo. Invece degli eventi è solo un altro middleware. Il tuo esempio sarà simile a

const mung = require('express-mung') 

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