IMHO, przyjęta odpowiedź na to pytanie nie jest tak naprawdę dokładna. Jak powiedzieli inni, tak naprawdę chodzi o kontrolowanie, kiedy następny handler w łańcuchu zostanie uruchomiony. Ale chciałem podać trochę więcej kodu, aby był bardziej konkretny. Załóżmy, że masz tę prostą aplikację ekspresową:
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!')
});
Jeśli zrobisz
curl http://localhost:3000/user/123
zobaczysz to wydrukowane na konsoli:
before request handler
handling request
after request handler
Teraz, jeśli skomentujesz wywołanie next()w środkowym module obsługi w następujący sposób:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Zobaczysz to na konsoli:
before request handler
handling request
Zwróć uwagę, że ostatni program obsługi (ten, który drukuje after request handler) nie działa. Dzieje się tak, ponieważ nie mówisz już ekspresowi, aby uruchamiał następny program obsługi.
Więc tak naprawdę nie ma znaczenia, czy "główny" program obsługi (ten, który zwraca 200) powiódł się, czy nie, jeśli chcesz, aby reszta oprogramowania pośredniego działała, musisz zadzwonić next().
Kiedy to się przyda? Załóżmy, że chcesz rejestrować wszystkie żądania, które wpłynęły do jakiejś bazy danych, niezależnie od tego, czy żądanie się powiodło.
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();
});
Jeśli chcesz, aby drugi program obsługi działał, musisz wywołać next()pierwszy program obsługi.
Pamiętaj, że węzeł jest asynchroniczny, więc nie może wiedzieć, kiedy zakończyło się wywołanie zwrotne pierwszego programu obsługi. Musisz to powiedzieć dzwoniąc next().