IMHO, câu trả lời được chấp nhận cho câu hỏi này không thực sự chính xác. Như những người khác đã nói, nó thực sự là về việc kiểm soát khi nào trình xử lý tiếp theo trong chuỗi được chạy. Nhưng tôi muốn cung cấp thêm một chút mã để làm cho nó cụ thể hơn. Giả sử bạn có ứng dụng nhanh đơn giản này:
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!')
});
Nếu bạn làm
curl http://localhost:3000/user/123
bạn sẽ thấy điều này được in ra bảng điều khiển:
before request handler
handling request
after request handler
Bây giờ nếu bạn nhận xét cuộc gọi đến next()
trong trình xử lý giữa như thế này:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Bạn sẽ thấy điều này trên bảng điều khiển:
before request handler
handling request
Lưu ý rằng trình xử lý cuối cùng (trình xử lý được in ra after request handler
) không chạy. Đó là bởi vì bạn không còn yêu cầu express chạy trình xử lý tiếp theo.
Vì vậy, không thực sự quan trọng nếu trình xử lý "chính" của bạn (trình xử lý trả về 200) thành công hay không, nếu bạn muốn phần mềm trung gian còn lại chạy, bạn phải gọi next()
.
Khi nào điều này sẽ có ích? Giả sử bạn muốn ghi lại tất cả các yêu cầu đến cơ sở dữ liệu nào đó bất kể yêu cầu đó có thành công hay không.
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();
});
Nếu bạn muốn trình xử lý thứ hai chạy, bạn phải gọi next()
trong trình xử lý thứ nhất.
Hãy nhớ rằng nút không đồng bộ nên nó không thể biết khi nào lệnh gọi lại của trình xử lý đầu tiên kết thúc. Bạn phải nói với nó bằng cách gọi điện next()
.