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
करता है) नहीं चलता है। ऐसा इसलिए क्योंकि अब आप अगले हैंडलर को चलाने के लिए एक्सप्रेस नहीं कह रहे हैं।
तो यह वास्तव में कोई फर्क नहीं पड़ता कि आपका "मुख्य" हैंडलर (जो 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()
पहले हैंडलर में कॉल करना होगा ।
याद रखें कि नोड async है इसलिए यह पता नहीं चल सकता है कि पहले हैंडलर का कॉलबैक कब समाप्त हुआ है। आपको इसे कॉल करके बताना होगा next()
।