ІМХО, прийнята відповідь на це питання насправді не є точною. Як заявили інші, це дійсно стосується контролю, коли буде запущений наступний обробник ланцюга. Але я хотів надати трохи більше коду, щоб зробити його більш конкретним. Скажіть, у вас є це просте експрес-додаток:
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!')
});
Якщо ти зробиш
curl http://localhost:3000/user/123
ви побачите це надруковано на консолі:
before request handler
handling request
after request handler
Тепер, якщо ви прокоментуєте дзвінок до next()
середнього обробника так:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Ви побачите це на консолі:
before request handler
handling request
Зауважте, що останній обробник (той, що друкує) after request handler
) не працює. Це тому, що ви більше не говорите експрес, щоб запустити наступний обробник.
Тому насправді не важливо, чи був ваш "основний" обробник (той, який повертає 200), був успішним чи ні, якщо ви хочете, щоб решта середніх програм працювала, вам потрібно зателефонувати next()
.
Коли це стане в нагоді? Скажімо, ви хочете реєструвати всі запити, які надходили до якоїсь бази даних, незалежно від того, вдався запит чи ні.
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();
});
Якщо ви хочете, щоб другий обробник працював, вам потрібно зателефонувати next()
в перший обробник.
Пам'ятайте, що вузол є асинхронним, тому він не може знати, коли закінчився зворотний дзвінок першого обробника. Ви повинні сказати це, зателефонувавши next()
.