En mi humilde opinión, la respuesta aceptada a esta pregunta no es realmente precisa. Como han dicho otros, en realidad se trata de controlar cuándo se ejecuta el siguiente controlador de la cadena. Pero quería proporcionar un poco más de código para hacerlo más concreto. Digamos que tiene esta sencilla aplicación express:
var express = require('express');
var app = express();
app.get('/user/:id', function (req, res, next) {
console.log('before request handler');
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('after request handler');
next();
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
});
Si lo haces
curl http://localhost:3000/user/123
verá esto impreso en la consola:
before request handler
handling request
after request handler
Ahora, si comentas la llamada next()
en el controlador central de esta manera:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Verá esto en la consola:
before request handler
handling request
Observe que el último controlador (el que imprime after request handler
) no se ejecuta. Eso es porque ya no le estás diciendo a express que ejecute el siguiente controlador.
Por lo tanto, realmente no importa si su controlador "principal" (el que devuelve 200) fue exitoso o no, si desea que se ejecute el resto de los middlewares, debe llamar next()
.
¿Cuándo sería esto útil? Supongamos que desea registrar todas las solicitudes que llegaron a alguna base de datos, independientemente de si la solicitud se realizó correctamente o no.
app.get('/user/:id', function (req, res, next) {
try {
// ...
}
catch (ex) {
// ...
}
finally {
// go to the next handler regardless of what happened in this one
next();
}
});
app.get('/user/:id', function (req, res, next) {
logToDatabase(req);
next();
});
Si desea que se ejecute el segundo controlador, debe llamar next()
al primer controlador.
Recuerde que el nodo es asíncrono, por lo que no puede saber cuándo finalizó la devolución de llamada del primer controlador. Tienes que decirlo llamando next()
.