IMHO คำตอบที่ยอมรับสำหรับคำถามนี้ไม่ถูกต้องจริงๆ ตามที่คนอื่น ๆ กล่าวไว้มันเกี่ยวกับการควบคุมเมื่อตัวจัดการถัดไปในห่วงโซ่ทำงาน แต่ฉันต้องการระบุรหัสเพิ่มเติมเล็กน้อยเพื่อให้เป็นรูปธรรมมากขึ้น สมมติว่าคุณมีแอปด่วนง่ายๆนี้:
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
) ไม่ทำงาน นั่นเป็นเพราะคุณไม่ได้บอกให้ Express เรียกใช้ตัวจัดการคนถัดไปอีกต่อไป
ดังนั้นจึงไม่ได้เรื่องจริงๆถ้าคุณ "หลัก" จัดการ (หนึ่งที่ผลตอบแทน 200) ประสบความสำเร็จหรือไม่ถ้าคุณต้องการที่เหลือของ middlewares 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()
ตัวจัดการแรก
โปรดจำไว้ว่าโหนดเป็นแบบ async ดังนั้นจึงไม่สามารถทราบได้ว่าเมื่อใดที่การเรียกกลับของตัวจัดการคนแรกเสร็จสิ้น next()
คุณต้องบอกว่าโดยการเรียก