IMHO, jawaban yang diterima untuk pertanyaan ini tidak terlalu akurat. Seperti yang dinyatakan orang lain, ini benar-benar tentang mengontrol kapan penangan berikutnya dalam rantai dijalankan. Tetapi saya ingin memberikan sedikit lebih banyak kode untuk membuatnya lebih konkret. Katakanlah Anda memiliki aplikasi ekspres sederhana ini:
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!')
});
Jika kamu melakukan
curl http://localhost:3000/user/123
Anda akan melihat ini dicetak ke konsol:
before request handler
handling request
after request handler
Sekarang jika Anda mengomentari panggilan ke next()
penangan tengah seperti ini:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Anda akan melihat ini di konsol:
before request handler
handling request
Perhatikan bahwa penangan terakhir (yang mencetak after request handler
) tidak berjalan. Itu karena Anda tidak lagi memberi tahu ekspres untuk menjalankan penangan berikutnya.
Jadi tidak masalah apakah penangan "utama" Anda (yang mengembalikan 200) berhasil atau tidak, jika Anda ingin agar perantara lainnya berjalan, Anda harus memanggil next()
.
Kapan ini akan berguna? Katakanlah Anda ingin mencatat semua permintaan yang masuk ke beberapa database terlepas dari apakah permintaan itu berhasil atau tidak.
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();
});
Jika Anda ingin penangan kedua berjalan, Anda harus memanggil next()
penangan pertama.
Ingatlah bahwa node itu asinkron sehingga tidak dapat mengetahui kapan callback penangan pertama telah selesai. Anda harus mengatakannya dengan menelepon next()
.