আইএমএইচও, এই প্রশ্নের গৃহীত উত্তর সত্যই সঠিক নয়। অন্যরা যেমন বলেছে, চেইনের পরবর্তী হ্যান্ডলারটি চালানো হয় তখন এটি নিয়ন্ত্রণ করার বিষয়ে। তবে আমি এটিকে আরও কংক্রিট করার জন্য আরও কিছু কোড সরবরাহ করতে চেয়েছিলাম। বলুন আপনার কাছে এই সাধারণ এক্সপ্রেস অ্যাপ রয়েছে:
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()
প্রথম হ্যান্ডলারে কল করতে হবে ।
মনে রাখবেন নোড অ্যাসিঙ্ক তাই প্রথম হ্যান্ডলারের কলব্যাক কখন শেষ হবে তা তা জানতে পারে না। আপনাকে ফোন করে বলতে হবে next()
।