Mi piacerebbe scrivere una funzione middleware espressa che imposta un listener sull'evento 'end' della risposta, se ne esiste uno. Lo scopo è quello di eseguire la pulizia in base al codice di risposta http che il gestore finale ha deciso di inviare, ad es. registrazione del codice di risposta e rollback/commit di una transazione db. io voglio che questa pulizia sia trasparente per il chiamante finale.Come posso catturare un evento "risposta fine" in node.js + express?
Mi piacerebbe fare qualcosa di simile a quanto segue in espresso:
Il percorso middleware
function (req, res, next) {
res.on ('end', function() {
// log the response code and handle db
if (res.statusCode < 400) { db.commit() } else { db.rollback() }
});
next();
}
Il percorso:
app.post ("/something", function (req, res) {
db.doSomething (function() {
if (some problem) {
res.send (500);
} else {
res.send (200);
}
});
}
Quando provo questo, la 'fine' il gestore di eventi non viene mai chiamato. Lo stesso per res.on('close')
, di cui ho letto in un altro post. Questi eventi vengono licenziati?
L'unico altro modo che posso pensare di fare questo è il wrapping res.end
o res.send
con la mia versione in un middleware personalizzato. Questo non è l'ideale, perché res.end
e res.send
non accettano le richiamate, quindi non posso semplicemente racchiuderle, chiamare l'originale e poi fare le mie cose basandomi sul codice di risposta che è stato impostato quando mi richiamano (perché hanno vinto " t richiamami).
C'è un modo semplice per farlo?
Perché non fare le cose di pulizia prima di 'res.end'? –
Anche questo va bene, ma voglio farlo come middleware, cioè senza che il gestore finale debba preoccuparsi della pulizia. Quindi, se voglio registrare il codice di risposta risultante, o eseguire il rollback/commit della transazione db in base al codice di risposta, voglio che funzioni in modo trasparente al gestore finale. Quindi sto cercando di intercettare l'esecuzione ad un certo punto tra l'end handler che chiama res.send e la richiesta che viene eseguita. – Jake
Ma ** tu ** stai definendo il codice di stato:/ –