ExpressJS অ্যাপ্লিকেশন ডেভেলপমেন্টে middleware একটি অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। Middleware হল একটি ফাংশন বা কম্পোনেন্ট যা HTTP রিকোয়েস্টের আগে বা পরে চলতে থাকে এবং রিকোয়েস্ট/রেসপন্স সাইকেলটি প্রক্রিয়া করে। ExpressJS-এ middleware ব্যবহার করা হয় অ্যাপ্লিকেশন লজিকের বিভিন্ন অংশে, যেমন রিকোয়েস্ট ভ্যালিডেশন, অথেনটিকেশন, রাউটিং, লগিং, এরর হ্যান্ডলিং ইত্যাদি।
Middleware কী?
ExpressJS-এ middleware এমন একটি ফাংশন যা ইনপুট রিকোয়েস্ট, আউটপুট রেসপন্স, এবং অ্যাপ্লিকেশনের লজিকের মধ্যে প্রক্রিয়া করতে পারে। এটি একটি ফাংশন যা তিনটি প্যারামিটার নেয়:
function (req, res, next) {
// Middleware logic
}
req: ইনপুট রিকোয়েস্ট অবজেক্ট।res: আউটপুট রেসপন্স অবজেক্ট।next: এই ফাংশনটি পরবর্তী middleware বা রাউট হ্যান্ডলারকে কল করতে ব্যবহৃত হয়।
Middleware সাধারণত রিকোয়েস্টের উপর কিছু পরিবর্তন করতে পারে, যেমন:
- রিকোয়েস্টে তথ্য অ্যাড করা,
- রিকোয়েস্ট বা রেসপন্স লগ করা,
- অথেনটিকেশন বা অথোরাইজেশন চেক করা, ইত্যাদি।
এছাড়া, middleware কখনো কখনো পুরো রিকোয়েস্ট সাইকেল থামিয়ে দিতে পারে, যেমন রেসপন্স সেন্ট করা বা এরর পাঠানো।
Middleware এর প্রকারভেদ
ExpressJS-এ বিভিন্ন ধরনের middleware ব্যবহার করা হয়, যেগুলি ভিন্ন ভিন্ন উদ্দেশ্যে ব্যবহৃত হয়।
১. Application-level middleware
এই ধরনের middleware অ্যাপ্লিকেশনের মধ্যে সর্বত্র ব্যবহৃত হয়। সাধারণত এটি সার্ভারের মধ্যে সব রিকোয়েস্টের জন্য ব্যবহৃত হয়।
const express = require('express');
const app = express();
// Application-level middleware
app.use((req, res, next) => {
console.log('Request received!');
next(); // পরবর্তী middleware বা রাউট হ্যান্ডলারকে কল করবে
});
২. Router-level middleware
এটি এক বা একাধিক রাউটের জন্য middleware প্রযোজ্য করতে ব্যবহৃত হয়। একাধিক রাউটের জন্য middleware সেট করা যায়।
const router = express.Router();
// Router-level middleware
router.use((req, res, next) => {
console.log('Router-level middleware');
next();
});
router.get('/', (req, res) => {
res.send('Hello from the router');
});
app.use('/router', router);
৩. Error-handling middleware
এটি এরর হ্যান্ডলিং করার জন্য ব্যবহৃত হয়। সাধারণত এরর হ্যান্ডলিং middleware অ্যাপ্লিকেশনের শেষের দিকে চলে আসে।
// Error-handling middleware
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something went wrong!');
});
৪. Built-in middleware
ExpressJS কিছু বিল্ট-ইন middleware সরবরাহ করে, যা অ্যাপ্লিকেশনে সাধারণ কাজগুলির জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ:
express.static(): স্ট্যাটিক ফাইল সরবরাহ করার জন্য ব্যবহৃত।app.use(express.static('public'));express.json(): JSON বডি পার্স করার জন্য।app.use(express.json());
৫. Third-party middleware
ExpressJS-এ তৃতীয় পক্ষের লাইব্রেরি বা প্যাকেজ ব্যবহার করে middleware ইনস্টল এবং ব্যবহার করা যায়। উদাহরণস্বরূপ, morgan (HTTP লগিং middleware), cors (Cross-Origin Resource Sharing), ইত্যাদি।
const morgan = require('morgan');
// Morgan middleware for logging
app.use(morgan('tiny'));
Middleware এর ভূমিকা
ExpressJS অ্যাপ্লিকেশন ডেভেলপমেন্টে middleware বিভিন্ন গুরুত্বপূর্ণ কাজ করে। এখানে কিছু গুরুত্বপূর্ণ ভূমিকা আলোচনা করা হলো:
১. রিকোয়েস্ট ভ্যালিডেশন
Middleware ব্যবহার করে রিকোয়েস্টের ডাটা চেক করা যায়। উদাহরণস্বরূপ, ইউজারের সাপোর্ট ফর্ম সাবমিট করার আগে ডাটা ভ্যালিডেশন করা।
app.use((req, res, next) => {
if (!req.body.name || !req.body.email) {
return res.status(400).send('Name and email are required');
}
next();
});
২. অথেনটিকেশন এবং অথোরাইজেশন
Middleware ব্যবহার করে ইউজার অথেনটিকেশন এবং অথোরাইজেশন চেক করা হয়। উদাহরণস্বরূপ, যদি ইউজার লগইন না থাকে, তবে এক্সেস নিষিদ্ধ করা যায়।
const isAuthenticated = (req, res, next) => {
if (!req.user) {
return res.status(401).send('Unauthorized');
}
next();
};
app.use('/dashboard', isAuthenticated, (req, res) => {
res.send('Welcome to the dashboard');
});
৩. লগিং এবং মনিটরিং
আপনি middleware ব্যবহার করে রিকোয়েস্ট এবং রেসপন্স লগ করতে পারেন। এর মাধ্যমে অ্যাপ্লিকেশনের কার্যকলাপ ট্র্যাক করা যায়।
app.use((req, res, next) => {
console.log(`${req.method} request made to ${req.url}`);
next();
});
৪. স্ট্যাটিক ফাইল সার্ভিং
ExpressJS-এ express.static() middleware ব্যবহার করে স্ট্যাটিক ফাইল যেমন CSS, JavaScript, ইমেজ ইত্যাদি সরবরাহ করা হয়।
app.use(express.static('public'));
৫. এরর হ্যান্ডলিং
Middleware ব্যবহার করে এরর হ্যান্ডলিং করা হয়। যদি কোনো এরর ঘটে, তবে অ্যাপ্লিকেশন সেই এররের জন্য নির্দিষ্ট রেসপন্স প্রেরণ করতে পারে।
app.use((err, req, res, next) => {
console.error(err.message);
res.status(500).send('Something went wrong!');
});
সারাংশ
ExpressJS-এ middleware হল রিকোয়েস্ট এবং রেসপন্স সাইকেল পরিচালনা করার একটি শক্তিশালী পদ্ধতি। এটি অ্যাপ্লিকেশন লজিকের মধ্যে বিভিন্ন ধরণের কার্যকলাপ যেমন অথেনটিকেশন, রিকোয়েস্ট ভ্যালিডেশন, লগিং, স্ট্যাটিক ফাইল সার্ভিং, এবং এরর হ্যান্ডলিং পরিচালনা করতে সহায়তা করে। ExpressJS-এ middleware ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরো সংগঠিত, নিরাপদ এবং স্কেলেবল করতে পারেন।
ExpressJS-এ middleware হল একটি ফাংশন বা কোড যা HTTP রিকোয়েস্ট এবং রেসপন্স এর মধ্যে প্রক্রিয়া করতে ব্যবহৃত হয়। Middleware ব্যবহারের মাধ্যমে আপনি রিকোয়েস্ট এবং রেসপন্স অবজেক্টে ম্যানিপুলেশন, লগিং, অথেন্টিকেশন, অথবা অন্যান্য কার্যক্রম করতে পারেন।
Middleware কি?
Middleware একটি ফাংশন যা Express অ্যাপ্লিকেশন চালানোর সময় রিকোয়েস্ট এবং রেসপন্স এর সাথে কাজ করে। এই ফাংশনটি সাধারণত request-response cycle এর মধ্যে ব্যবহৃত হয়। ExpressJS-এ middleware একাধিক কাজ করতে পারে, যেমন:
- রিকোয়েস্ট বা রেসপন্স হ্যান্ডল করা
- অথেন্টিকেশন যাচাই করা
- কুকি বা হেডার সেট করা
- রিকোয়েস্ট লগ করা
- ত্রুটি পরিচালনা করা
ExpressJS একটি স্ট্যাক হিসেবে কাজ করে যেখানে একাধিক middleware একে একে কল করা হয়, এবং এটি প্রক্রিয়া শেষ না হওয়া পর্যন্ত রিকোয়েস্ট এবং রেসপন্স অবজেক্টকে ট্রান্সফর্ম করতে থাকে।
Middleware কিভাবে কাজ করে?
ExpressJS-এ middleware একটি ফাংশন হিসেবে কাজ করে যা দুইটি মূল উপাদান নিয়ে থাকে:
- req (request): রিকোয়েস্ট অবজেক্ট, যা ক্লায়েন্ট থেকে সার্ভারে পাঠানো হয়।
- res (response): রেসপন্স অবজেক্ট, যা সার্ভার থেকে ক্লায়েন্টকে পাঠানো হয়।
এছাড়া, middleware একটি next ফাংশনও গ্রহণ করে যা পরবর্তী middleware বা রাউট হ্যান্ডলারে রিকোয়েস্টটি পাঠাতে সাহায্য করে।
Middleware ফাংশনের সাধারণ কাঠামো:
function middleware(req, res, next) {
// কিছু কোড
next(); // পরবর্তী middleware বা রাউট হ্যান্ডলারে চলে যাবে
}
Middleware এর কাজের স্টেপ:
- রিকোয়েস্ট আসার পর প্রথম middleware কোডটি রান করবে।
- যদি এই middleware ত্রুটি না ঘটায় এবং
next()কল করা হয়, তাহলে এটি পরবর্তী middleware বা রাউট হ্যান্ডলারে যাবে। - একাধিক middleware একে একে এক্সিকিউট হবে যতক্ষণ না রিকোয়েস্ট সম্পন্ন হয়।
Middleware এর ধরন
ExpressJS-এ middleware মূলত তিন ধরনের হতে পারে:
১. Application-level Middleware
এটি অ্যাপ্লিকেশন স্তরের middleware, যা সার্ভারের সকল রিকোয়েস্টের জন্য একাধিক রাউট বা পাথ এর উপর কাজ করতে পারে। সাধারণত app.use() বা app.METHOD() এর মাধ্যমে অ্যাপ্লিকেশন লেভেলে middleware ব্যবহার করা হয়।
উদাহরণ:
const express = require('express');
const app = express();
// অ্যাপ্লিকেশন লেভেল middleware
app.use((req, res, next) => {
console.log('একটি রিকোয়েস্ট এসেছে!');
next(); // পরবর্তী middleware বা রাউট হ্যান্ডলার
});
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
২. Router-level Middleware
এই ধরনের middleware শুধুমাত্র একটি নির্দিষ্ট রাউটের জন্য কার্যকরী হয়। এটি express.Router() ব্যবহার করে রাউট লেভেল middleware তৈরি করা হয়।
উদাহরণ:
const express = require('express');
const app = express();
const router = express.Router();
// রাউট লেভেল middleware
router.use((req, res, next) => {
console.log('রাউট প্রক্রিয়া শুরু হয়েছে!');
next();
});
router.get('/', (req, res) => {
res.send('This is the Home Page');
});
app.use('/home', router); // এই রাউটের জন্য middleware কার্যকরী হবে
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
৩. Error-handling Middleware
এটি এমন middleware যা ত্রুটি পরিচালনা করে। যদি কোনো error ঘটে, এটি next(err) কল করে এবং ExpressJS ত্রুটি হ্যান্ডলিং middleware এ চলে যায়।
উদাহরণ:
const express = require('express');
const app = express();
// সাধারণ middleware
app.use((req, res, next) => {
throw new Error('Something went wrong!');
next();
});
// ত্রুটি হ্যান্ডলিং middleware
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something went wrong!');
});
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
Middleware এর ব্যবহার
১. Logging
যেকোনো HTTP রিকোয়েস্টের লগ রাখা middleware দিয়ে করা যায়। এটি ডিবাগিং এবং মনিটরিং এর জন্য খুবই গুরুত্বপূর্ণ।
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
২. Authentication
ব্যবহারকারীর অথেন্টিকেশন যাচাই করার জন্য middleware ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি লগিন সিস্টেমে ব্যবহারকারী যদি লগড ইন না থাকে, তাহলে তাকে নির্দিষ্ট রাউটে প্রবেশ করতে দেওয়া হয় না।
function isAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
app.get('/dashboard', isAuthenticated, (req, res) => {
res.send('Welcome to your dashboard');
});
৩. Static File Serving
ExpressJS express.static() মিডলওয়্যার ব্যবহার করে স্ট্যাটিক ফাইল সরবরাহ করতে পারে। এর মাধ্যমে CSS, JS, এবং ইমেজ ফাইলগুলো সহজেই সার্ভ করা যায়।
app.use(express.static('public'));
সারাংশ
ExpressJS-এ middleware হল এমন ফাংশন যা HTTP রিকোয়েস্ট এবং রেসপন্স এর মধ্যে ব্যবহৃত হয়। এটি বিভিন্ন কাজ যেমন রিকোয়েস্টের লগিং, অথেন্টিকেশন, এবং ত্রুটি হ্যান্ডলিং করার জন্য ব্যবহৃত হয়। ExpressJS middleware সাধারণত অ্যাপ্লিকেশন, রাউট, এবং ত্রুটি হ্যান্ডলিং স্তরে বিভক্ত হয়। Middleware ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনকে আরও শক্তিশালী, নিরাপদ এবং পরিচালনাযোগ্য করতে পারেন।
ExpressJS এ Middleware একটি গুরুত্বপূর্ণ কনসেপ্ট, যা অ্যাপ্লিকেশনে বিভিন্ন ধরনের রিকোয়েস্ট এবং রেসপন্স প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Middleware হল এমন ফাংশন যা HTTP রিকোয়েস্ট এবং রেসপন্স অবজেক্টের মধ্যে মধ্যবর্তী প্রক্রিয়ায় কাজ করে। ExpressJS এ দুটি প্রধান ধরনের Middleware আছে: Application Level Middleware এবং Router Level Middleware। নিচে এদের মধ্যে পার্থক্য এবং ব্যবহার ব্যাখ্যা করা হলো।
১. Application Level Middleware
Application Level Middleware হল সেই Middleware যা পুরো Express অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হয়। এটি Express অ্যাপ্লিকেশনের মধ্যে সাধারণভাবে সমস্ত রিকোয়েস্ট এবং রেসপন্স প্রক্রিয়ার জন্য ব্যবহৃত হয়।
১.১. Application Level Middleware কিভাবে কাজ করে?
Express অ্যাপ্লিকেশনে, Application Level Middleware ব্যবহার করতে app.use() অথবা app.METHOD() ফাংশন ব্যবহার করা হয়। এখানে METHOD হল HTTP পদ্ধতি যেমন GET, POST, PUT, DELETE, ইত্যাদি। app.use() দিয়ে সাধারণত সমস্ত HTTP রিকোয়েস্টের জন্য Middleware ব্যবহার করা হয়।
১.২. উদাহরণ
const express = require('express');
const app = express();
// Application level middleware
app.use((req, res, next) => {
console.log('Time:', Date.now());
next(); // মেক্সিনাম এক্সিকিউশনের জন্য পরবর্তী middleware ফাংশন চালু হবে
});
// একটি রুট তৈরি করা
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
এখানে, app.use() Middleware সবার জন্য প্রযোজ্য। যেকোনো রিকোয়েস্ট আসলেই এই Middleware ফাংশনটি প্রথমে কাজ করবে এবং পরে পরবর্তী রাউট ফাংশনে যাবে।
১.৩. সাধারণ ব্যবহারের উদাহরণ
- লগিং: প্রতিটি রিকোয়েস্টের লগ রাখা
- অথেন্টিকেশন: ইউজারের অথেন্টিকেশন চেক করা
- স্ট্যাটিক ফাইল সার্ভ করা
- CORS হ্যান্ডলিং
২. Router Level Middleware
Router Level Middleware হল এমন Middleware যা শুধুমাত্র নির্দিষ্ট রাউট বা রাউট গ্রুপের জন্য ব্যবহৃত হয়। এটি express.Router() ব্যবহার করে তৈরি করা হয় এবং শুধুমাত্র সেই রাউট বা রাউট গ্রুপের জন্য প্রযোজ্য হয়, যেখানে Middlewareটি ডিফাইন করা হয়েছে।
২.১. Router Level Middleware কিভাবে কাজ করে?
ExpressJS এ router.use() ফাংশন ব্যবহার করে Router Level Middleware ব্যবহার করা হয়। এই Middleware কেবলমাত্র সেই রাউটগুলির জন্য কার্যকর হবে যেগুলিতে তা যোগ করা হয়েছে।
২.২. উদাহরণ
const express = require('express');
const app = express();
const router = express.Router();
// Router level middleware
router.use((req, res, next) => {
console.log('Router level middleware for /api');
next();
});
// এই রাউটটি /api/ path-এ শুধু কাজ করবে
router.get('/data', (req, res) => {
res.send('Data from /api');
});
// মূল অ্যাপ্লিকেশনে রাউটটি যুক্ত করা
app.use('/api', router);
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
এখানে, router.use() Middleware শুধুমাত্র /api রাউটের জন্য প্রযোজ্য। app.use('/api', router) ব্যবহার করে, আমরা /api পাথের রাউটগুলোকে Router Level Middleware এর আওতায় এনেছি।
২.৩. সাধারণ ব্যবহারের উদাহরণ
- API সেকশনগুলোতে বিশেষ কিছু Middleware প্রয়োগ করা
- ইউজার বা প্রশাসক ভিন্ন ভিন্ন রাউটের জন্য Middleware প্রয়োগ করা
৩. Middleware এর পার্থক্য: Application Level এবং Router Level
| Feature | Application Level Middleware | Router Level Middleware |
|---|---|---|
| Scope | পুরো অ্যাপ্লিকেশন জুড়ে প্রযোজ্য | নির্দিষ্ট রাউট বা রাউট গ্রুপের জন্য প্রযোজ্য |
| ব্যবহার | app.use() বা app.METHOD() দিয়ে ব্যবহৃত হয় | router.use() দিয়ে ব্যবহৃত হয় |
| ব্যবহারের উদ্দেশ্য | সাধারণত সার্বিক কাজ যেমন লগিং, অথেন্টিকেশন ইত্যাদি | নির্দিষ্ট API বা রাউট গ্রুপের জন্য Middleware প্রয়োগ করা |
| এফেক্ট | সমস্ত রিকোয়েস্টের জন্য কাজ করে | শুধুমাত্র নির্দিষ্ট রাউটের জন্য কাজ করে |
৪. Middleware স্ট্যাক
ExpressJS Middleware এর একটি স্ট্যাক তৈরি করে, যেখানে Middleware ফাংশনগুলো পরপর কার্যকর হয়। এই স্ট্যাকটি নির্ধারণ করে কোন Middleware আগে চলবে এবং কোনটি পরে চলবে। next() ফাংশনটি Middleware চেইনে পরবর্তী ফাংশনকে কল করতে ব্যবহৃত হয়।
সারাংশ
- Application Level Middleware: এটি পুরো অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হয় এবং সাধারণত লগিং, অথেন্টিকেশন, CORS হ্যান্ডলিং, ইত্যাদি কাজের জন্য ব্যবহৃত হয়।
- Router Level Middleware: এটি শুধু নির্দিষ্ট রাউট বা রাউট গ্রুপে প্রযোজ্য হয় এবং বিশেষ API গুলি পরিচালনা করার জন্য ব্যবহৃত হয়।
- Middleware ব্যবহার করার মাধ্যমে, আপনি একটি অ্যাপ্লিকেশনের বিভিন্ন রিকোয়েস্ট প্রসেসিং-এর জন্য আরও ফ্লেক্সিবল এবং কাস্টমাইজড সমাধান তৈরি করতে পারেন।
ExpressJS-এ middleware একটি গুরুত্বপূর্ণ উপাদান, যা রিকোয়েস্ট এবং রেসপন্স সাইকেলের মাঝে কার্যকরভাবে কাজ করে। Middleware হলো এমন ফাংশন, যা রিকোয়েস্ট এবং রেসপন্স অবজেক্টের মধ্যে এক্সিকিউট হয়, এবং এটি সার্ভার সাইডে কিছু নির্দিষ্ট কাজ যেমন রিকোয়েস্ট ভ্যালিডেশন, লগিং, অথেনটিকেশন ইত্যাদি করতে ব্যবহৃত হয়।
ExpressJS দুটি প্রধান ধরনের middleware সাপোর্ট করে: built-in middleware এবং custom middleware।
১. Built-in Middleware
ExpressJS-এ কিছু সাধারণ এবং প্রয়োজনীয় built-in middleware রয়েছে যা আপনাকে বিভিন্ন কাজ সহজে করতে সাহায্য করে। এই middleware গুলো Express এর সাথে ডিফল্টভাবে আসে এবং আপনাকে আলাদাভাবে ইন্সটল বা কনফিগার করতে হয় না।
১.১. express.json()
এই middleware JSON ডাটা পার্স করতে ব্যবহৃত হয়। যখন ক্লায়েন্ট থেকে JSON ডাটা আসে, তখন এটি স্বয়ংক্রিয়ভাবে রিকোয়েস্ট বডিতে থাকা JSON ডাটা পার্স করে।
ব্যবহার:
const express = require('express');
const app = express();
// JSON বডি পার্স করার জন্য express.json() ব্যবহার করা হচ্ছে
app.use(express.json());
app.post('/data', (req, res) => {
console.log(req.body); // এখানে ক্লায়েন্ট থেকে পাঠানো JSON ডাটা পাওয়া যাবে
res.send('Data received');
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
১.২. express.urlencoded()
এই middleware URL-এনকোডেড ডাটা পার্স করতে ব্যবহৃত হয়। যখন ক্লায়েন্ট থেকে ফর্ম ডাটা পাঠানো হয় (যেমন HTML ফর্ম), তখন এই middleware তা পার্স করে।
ব্যবহার:
app.use(express.urlencoded({ extended: true }));
app.post('/form', (req, res) => {
console.log(req.body); // ফর্ম ডাটা পাওয়া যাবে
res.send('Form submitted');
});
১.৩. express.static()
এই middleware স্ট্যাটিক ফাইল (যেমন HTML, CSS, JavaScript, ইমেজ) সারা বিশ্বের ব্যবহারকারীদের কাছে সরবরাহ করতে ব্যবহৃত হয়।
ব্যবহার:
app.use(express.static('public')); // 'public' ফোল্ডারের স্ট্যাটিক ফাইল সরবরাহ করবে
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এই ক্ষেত্রে, যদি আপনি public ফোল্ডারে index.html ফাইল রাখেন, তবে http://localhost:3000/index.html ইউআরএল দিয়ে এটি অ্যাক্সেস করা যাবে।
২. Custom Middleware তৈরি করা
ExpressJS-এ আপনি কাস্টম middleware তৈরি করতে পারেন যা আপনার অ্যাপ্লিকেশনের নির্দিষ্ট কার্যাবলী বাস্তবায়ন করবে। Custom middleware সাধারণত এক বা একাধিক রিকোয়েস্ট হ্যান্ডলার হিসেবে কাজ করে এবং রিকোয়েস্ট বা রেসপন্স অবজেক্টের উপর প্রক্রিয়া সম্পন্ন করে।
২.১. Custom Middleware উদাহরণ
Custom middleware সাধারণত রিকোয়েস্টের পরিপ্রেক্ষিতে কিছু কাজ করে এবং রেসপন্স অবজেক্টে কিছু পরিবর্তন করে। উদাহরণস্বরূপ, আমরা একটি লগিং middleware তৈরি করতে পারি যা প্রতিটি রিকোয়েস্টের সময় এবং URL লগ করবে।
ব্যবহার:
const express = require('express');
const app = express();
// Custom Middleware
app.use((req, res, next) => {
console.log(`${req.method} request made to: ${req.url}`);
next(); // পরবর্তী middleware বা রাউট হ্যান্ডলারের কাছে রিকোয়েস্ট পাস করে
});
app.get('/', (req, res) => {
res.send('Home Page');
});
app.get('/about', (req, res) => {
res.send('About Page');
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে, middleware প্রতিটি রিকোয়েস্টের জন্য method (যেমন GET বা POST) এবং url কনসোল লগ করবে। next() ফাংশন কল করা খুবই গুরুত্বপূর্ণ, কারণ এটি রিকোয়েস্ট প্রোসেসিংকে পরবর্তী middleware বা রাউট হ্যান্ডলারের কাছে পাঠায়।
২.২. Authentication Middleware উদাহরণ
একটি সাধারণ অথেনটিকেশন middleware তৈরি করা যেতে পারে যা ইউজারের অথেনটিকেশন চেক করবে। যদি ইউজার অথেনটিকেটেড না থাকে, তবে একটি 401 (Unauthorized) স্ট্যাটাস রেসপন্স ফিরিয়ে দেওয়া হবে।
ব্যবহার:
const express = require('express');
const app = express();
// Custom Authentication Middleware
function authenticate(req, res, next) {
const token = req.headers['authorization'];
if (!token || token !== 'secret-token') {
return res.status(401).send('Unauthorized');
}
next(); // যদি token সঠিক হয়, পরবর্তী middleware বা রাউট হ্যান্ডলার চালানো হবে
}
// এই রাউটে authenticate middleware প্রযোজ্য
app.get('/dashboard', authenticate, (req, res) => {
res.send('Welcome to the Dashboard');
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে, /dashboard রাউটে রিকোয়েস্ট আসার আগে authenticate middleware কাজ করবে। যদি অথেনটিকেশন টোকেন সঠিক না হয়, তবে ইউজারকে "Unauthorized" রেসপন্স দেওয়া হবে।
৩. Middleware এর অর্ডার
ExpressJS-এ middleware এর অর্ডার খুবই গুরুত্বপূর্ণ। যখন আপনি app.use() বা রাউট ডিফাইন করেন, তখন সেগুলি যেভাবে কোডে রাখা হবে, সেভাবেই কাজ করবে। সাধারণত, জেনেরিক middleware (যেমন লগিং, বডি পার্সিং) প্রথমে এবং স্পেসিফিক রাউট middleware (যেমন অথেনটিকেশন) পরে ব্যবহার করা হয়।
উদাহরণ:
app.use(express.json()); // JSON বডি পার্সিং
app.use(authenticate); // অথেনটিকেশন middleware
app.get('/profile', (req, res) => {
res.send('User Profile');
});
এখানে, প্রথমে JSON বডি পার্সিং হবে এবং তারপর অথেনটিকেশন চেক করা হবে।
সারাংশ
ExpressJS-এ middleware হল এমন ফাংশন যা রিকোয়েস্ট এবং রেসপন্স সাইকেলের মধ্যে কার্যকর হয় এবং বিভিন্ন কার্যাবলী সম্পন্ন করতে ব্যবহৃত হয়। ExpressJS অনেক built-in middleware সরবরাহ করে যেমন express.json(), express.urlencoded(), এবং express.static()। এছাড়া, আপনি নিজে custom middleware তৈরি করে বিভিন্ন কাজ যেমন লগিং, অথেনটিকেশন, এবং কাস্টম ফিল্টারিং করতে পারেন। Middleware গুলোর অর্ডার এবং ব্যবহারের ক্ষেত্রে সতর্ক থাকা গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনটির কার্যকারিতাকে প্রভাবিত করতে পারে।
ExpressJS-এ Error Handling Middleware (ত্রুটি পরিচালনা মিডলওয়্যার) ব্যবহৃত হয় অ্যাপ্লিকেশনে যেকোনো ধরনের ত্রুটি বা ত্রুটি পরিস্থিতি সঠিকভাবে ধরতে এবং পরিচালনা করতে। এটি এমন এক ধরনের মিডলওয়্যার যা অ্যাপ্লিকেশনের অন্য সব রাউট এবং মিডলওয়্যার চালানোর পর সিস্টেমের ত্রুটি সনাক্ত করে এবং তা উপযুক্তভাবে হ্যান্ডেল করে।
একটি সঠিক ত্রুটি পরিচালনা প্রক্রিয়া অ্যাপ্লিকেশনটিকে আরো স্থিতিশীল এবং ব্যবহারকারীর জন্য সুবিধাজনক করে তোলে, বিশেষত যখন কোনো রাউট বা কার্যকলাপে কোনো ত্রুটি ঘটে।
Error Handling Middleware কিভাবে কাজ করে?
ExpressJS ত্রুটি পরিচালনার জন্য একটি বিশেষ মিডলওয়্যার তৈরি করতে সাহায্য করে, যা app.use() এর মাধ্যমে ব্যবহৃত হয়। এই মিডলওয়্যারটি সাধারণত ৪টি আর্গুমেন্ট নেয়:
err: ত্রুটি (Error) অবজেক্টreq: HTTP অনুরোধ (Request) অবজেক্টres: HTTP প্রতিক্রিয়া (Response) অবজেক্টnext: পরবর্তী মিডলওয়্যার ফাংশন কল করার জন্য ব্যবহার করা হয়
এই ৪টি আর্গুমেন্টের মাধ্যমে আপনি ত্রুটি (error) সনাক্ত করে প্রয়োজনীয় পদক্ষেপ নিতে পারবেন, যেমনঃ কাস্টম ত্রুটি বার্তা পাঠানো বা HTTP স্ট্যাটাস কোড সেট করা।
ExpressJS ত্রুটি পরিচালনার উদাহরণ
এখানে একটি সাধারণ ExpressJS ত্রুটি পরিচালনার মিডলওয়্যারের উদাহরণ দেওয়া হলো:
১. সাধারণ ত্রুটি পরিচালনা
const express = require('express');
const app = express();
const port = 3000;
// রুট রাউট
app.get('/', (req, res) => {
res.send('Hello World!');
});
// একটি ভুল রাউট (যেখানে ত্রুটি ঘটবে)
app.get('/error', (req, res, next) => {
const error = new Error('This is a sample error');
next(error); // ত্রুটি পরবর্তী মিডলওয়্যারকে পাঠানো হচ্ছে
});
// ত্রুটি পরিচালনা মিডলওয়্যার
app.use((err, req, res, next) => {
console.error(err.stack); // ত্রুটি লগ করা
res.status(500).send('Something went wrong!'); // ক্লায়েন্টকে ত্রুটি বার্তা পাঠানো
});
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});
কোড ব্যাখ্যা:
app.get('/error', ...): এই রাউটটি ত্রুটি ঘটানোর জন্য তৈরি করা হয়েছে, যেখানে একটি কাস্টম ত্রুটি তৈরি করেnext(error)দিয়ে পরবর্তী মিডলওয়্যারে পাঠানো হয়েছে।- Error Handling Middleware:
app.use()এর মাধ্যমে একটি ত্রুটি পরিচালনা মিডলওয়্যার যুক্ত করা হয়েছে যা সব রাউটের পর কার্যকর হবে। এই মিডলওয়্যারটি ত্রুটি লগ করবে এবং HTTP 500 (Internal Server Error) স্ট্যাটাস কোড সহ কাস্টম ত্রুটি বার্তা পাঠাবে।
২. কাস্টম ত্রুটি বার্তা এবং স্ট্যাটাস কোড
আপনি ত্রুটির ধরন অনুযায়ী কাস্টম ত্রুটি বার্তা এবং স্ট্যাটাস কোড নির্ধারণ করতে পারেন। উদাহরণস্বরূপ:
// কাস্টম ত্রুটি তৈরি এবং সেট করা
app.get('/not-found', (req, res, next) => {
const error = new Error('Page Not Found');
error.status = 404; // স্ট্যাটাস কোড 404 (Not Found)
next(error); // ত্রুটি পরবর্তী মিডলওয়্যারকে পাঠানো হচ্ছে
});
// ত্রুটি পরিচালনা মিডলওয়্যার
app.use((err, req, res, next) => {
res.status(err.status || 500); // যদি স্ট্যাটাস কোড না থাকে তবে 500 ব্যবহার করুন
res.json({
message: err.message, // ত্রুটি বার্তা
stack: err.stack // ত্রুটির স্ট্যাক ট্রেস (ডেভেলপারের জন্য)
});
});
কোড ব্যাখ্যা:
error.status = 404;: কাস্টম স্ট্যাটাস কোড (যেমন 404) নির্ধারণ করা হচ্ছে।res.status(err.status || 500);: যদি ত্রুটি অবজেক্টে কোনো স্ট্যাটাস কোড না থাকে, তবে ডিফল্ট 500 স্ট্যাটাস কোড ব্যবহার করা হবে।
৩. Asynchronous ত্রুটি হ্যান্ডলিং
ExpressJS তে অ্যাসিঙ্ক্রোনাস রাউটগুলোতেও ত্রুটি হ্যান্ডলিং করতে হয়। সাধারণত, আপনি একটি try-catch ব্লক ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোডে ত্রুটি পরিচালনা করেন।
app.get('/async-error', async (req, res, next) => {
try {
// সিমুলেটেড অ্যাসিঙ্ক্রোনাস ত্রুটি
const result = await someAsyncFunction();
res.send(result);
} catch (error) {
next(error); // ত্রুটি পরবর্তী মিডলওয়্যারকে পাঠানো হচ্ছে
}
});
এখানে next(error) ব্যবহার করে অ্যাসিঙ্ক্রোনাস ত্রুটি সঠিকভাবে মিডলওয়্যারে পাঠানো হচ্ছে।
সারাংশ
ExpressJS ত্রুটি পরিচালনা একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা অ্যাপ্লিকেশনকে স্থিতিশীল এবং ব্যবহারকারীর জন্য সুবিধাজনক করে তোলে। ত্রুটি পরিচালনা মিডলওয়্যার দিয়ে আপনি যেকোনো ধরনের ত্রুটি সনাক্ত করতে পারেন এবং কাস্টম ত্রুটি বার্তা ও স্ট্যাটাস কোডের মাধ্যমে ব্যবহারকারীকে উপযুক্ত প্রতিক্রিয়া প্রদান করতে পারেন। এভাবে, অ্যাপ্লিকেশনটি অনেক বেশি সুরক্ষিত এবং ব্যবহারকারী-বান্ধব হয়ে ওঠে।
Read more