Middleware হলো এমন একটি ফাংশন যা একটি রুটের হ্যান্ডলারের আগে চলে, রিকোয়েস্ট পরীক্ষা বা পরিবর্তন করার সুযোগসহ, তারপর হয় এটি এগিয়ে দেয় নয়তো সেখানেই থামায়। এভাবেই Express এমন কিছু সামলায় যা একাধিক রুটে ঘটা প্রয়োজন, প্রতিটি হ্যান্ডলারে কোড পুনরাবৃত্তি না করে।
একটি middleware ফাংশন তিনটি প্যারামিটার নেয় — req, res, আর একটি আরও: next।
function logger(req, res, next) {
console.log(`${req.method} ${req.url}`)
next()
}
app.use(logger)next() কল করা এরপর যা আসে তার কাছে নিয়ন্ত্রণ পাস করে — পরের middleware, অথবা মিলে যাওয়া রুটের নিজস্ব হ্যান্ডলার। এটি কল করতে ভুলে গেলে, রিকোয়েস্টটি শুধু ঝুলে থাকে — ব্রাউজার এমন একটি রেসপন্সের জন্য চিরকাল অপেক্ষা করে যা কখনো আসে না।
Express কিছু middleware ইতিমধ্যে অন্তর্ভুক্ত করে নিয়ে আসে। express.json() সবচেয়ে সাধারণ — এটি একটি JSON রিকোয়েস্ট বডি পড়ে আর সেটিকে req.body হিসেবে উপলব্ধ করে। পরের পাঠ এটি সম্পূর্ণভাবে কভার করে।
app.use(express.json())app.use() এর পরে আসা প্রতিটি রুটে প্রযোজ্য। একটি একক রুটে middleware সীমাবদ্ধ করতে, এটিকে একটি অতিরিক্ত আর্গুমেন্ট হিসেবে পাস করুন:
function requireLogin(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).send('Login required')
}
next()
}
app.get('/dashboard', requireLogin, (req, res) => {
res.send('Welcome to your dashboard')
})এই কারণেই রুট হ্যান্ডলারগুলো নিজেরাই একই (req, res) আকৃতি নেয় — একটি রুট হ্যান্ডলার আসলে চেইনের শেষ middleware মাত্র, যেটি next() কল না করে এর বদলে রেসপন্স পাঠায়।
তিনটির বদলে চারটি প্যারামিটারযুক্ত একটি middleware ফাংশনকে Express বিশেষভাবে গণ্য করে — এটি শুধু তখনই চলে যখন আগে কিছু next(error) কল করে অথবা throw করে:
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something went wrong')
})এই ধরনের middleware সবসময় শেষে যায়, প্রতিটি রুটের পরে — Express middleware রেজিস্টার হওয়ার ক্রমে মেলায়, তাই আগে বসানো একটি error হ্যান্ডলার এর পরে আসা রিকোয়েস্ট কখনো দেখতে পাবে না।