IMHO, a resposta aceita para esta pergunta não é realmente precisa. Como outros já declararam, trata-se realmente de controlar quando o próximo manipulador da cadeia é executado. Mas eu queria fornecer um pouco mais de código para torná-lo mais concreto. Digamos que você tenha este aplicativo expresso simples:
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!')
});
Se você fizer
curl http://localhost:3000/user/123
você verá isso impresso no console:
before request handler
handling request
after request handler
Agora, se você comentar a chamada para next()
no manipulador do meio, desta forma:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Você verá isso no console:
before request handler
handling request
Observe que o último manipulador (aquele que imprime after request handler
) não é executado. Isso ocorre porque você não está mais dizendo ao express para executar o próximo manipulador.
Portanto, realmente não importa se o manipulador "principal" (aquele que retorna 200) foi bem-sucedido ou não, se você deseja que o restante do middleware seja executado, é necessário ligar next()
.
Quando isso seria útil? Digamos que você deseja registrar todas as solicitações recebidas em algum banco de dados, independentemente de a solicitação ter ou não sido bem-sucedida.
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();
});
Se você deseja que o segundo manipulador seja executado, é necessário chamar next()
o primeiro manipulador.
Lembre-se de que o nó é assíncrono, portanto, não pode saber quando o retorno de chamada do primeiro manipulador foi concluído. Você precisa contar ligando next()
.