IMHO, bu sorunun kabul edilen cevabı gerçekten doğru değil. Diğerlerinin de belirttiği gibi, bu gerçekten zincirdeki bir sonraki işleyicinin ne zaman çalıştırılacağını kontrol etmekle ilgilidir. Ama daha somut hale getirmek için biraz daha kod sağlamak istedim. Bu basit ekspres uygulamaya sahip olduğunuzu varsayalım:
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!')
});
Yaparsan
curl http://localhost:3000/user/123
bunun konsola yazdırıldığını göreceksiniz:
before request handler
handling request
after request handler
Şimdi next(), orta işleyicideki çağrıyı şöyle yorumlarsanız:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Bunu konsolda göreceksiniz:
before request handler
handling request
Son işleyicinin (yazdıran after request handler) çalışmadığına dikkat edin. Bunun nedeni, artık bir sonraki işleyiciyi çalıştırmanızı ifade etmiyorsunuzdur.
Bu nedenle, "ana" işleyicinizin (200 döndüren) başarılı olup olmaması gerçekten önemli değil, ara yazılımların geri kalanının çalışmasını istiyorsanız, aramanız gerekir next().
Bu ne zaman işe yarayacak? Diyelim ki, istek başarılı olsun ya da olmasın, bazı veritabanlarına gelen tüm istekleri günlüğe kaydetmek istediğinizi varsayalım.
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();
});
İkinci işleyicinin çalışmasını istiyorsanız next(), ilk işleyiciyi aramanız gerekir .
Düğümün eşzamansız olduğunu unutmayın, böylece ilk işleyicinin geri aramasının ne zaman bittiğini bilemez. Bunu arayarak söylemelisin next().