KoaJS একটি আধুনিক ওয়েব ফ্রেমওয়ার্ক, যা মিডলওয়্যার সিস্টেমের উপর ভিত্তি করে তৈরি। KoaJS-এ, async/await এর মাধ্যমে অ্যাসিনক্রোনাস (Asynchronous) কোড খুব সহজে লেখা যায়, যা কোডকে আরও পরিষ্কার, সহজ এবং কার্যকরী করে তোলে। KoaJS মিডলওয়্যার ব্যবহারের সময়, async/await ব্যবহার করার ফলে রিকোয়েস্ট হ্যান্ডলিং আরও কার্যকরী হয় এবং কোডের পঠনযোগ্যতা বৃদ্ধি পায়।
KoaJS-এ মিডলওয়্যার সাধারণত async ফাংশন হয়, এবং এতে await next() ব্যবহার করা হয় পরবর্তী মিডলওয়্যার বা রিকোয়েস্ট প্রসেসিং চালানোর জন্য। এই ধারণাটি KoaJS-কে একেবারে কাস্টমাইজযোগ্য এবং স্কেলযোগ্য অ্যাপ্লিকেশন তৈরি করার সুযোগ প্রদান করে।
Middleware-এ Async/Await ব্যবহার
KoaJS-এ, মিডলওয়্যার চেইন এক্সিকিউট করা হয় async/await ব্যবহার করে। প্রতিটি মিডলওয়্যার ফাংশন একটি async ফাংশন হয়, যার মধ্যে await next() ব্যবহার করা হয়। এর মাধ্যমে আপনি পরবর্তী মিডলওয়্যার চালাতে পারেন, এবং এর ফলে অ্যাসিনক্রোনাস অপারেশন খুবই সহজ হয়ে যায়। next() ফাংশনটি পরবর্তী মিডলওয়্যার বা রিকোয়েস্ট হ্যান্ডলারকে চালাতে ব্যবহৃত হয়।
সাধারণ মিডলওয়্যার উদাহরণ:
const Koa = require('koa');
const app = new Koa();
// প্রথম মিডলওয়্যার
app.use(async (ctx, next) => {
console.log('Middleware 1: Request received');
await next(); // পরবর্তী মিডলওয়্যার কল করা
console.log('Middleware 1: Response sent');
});
// দ্বিতীয় মিডলওয়্যার
app.use(async (ctx, next) => {
console.log('Middleware 2: Request received');
await next(); // পরবর্তী মিডলওয়্যার কল করা
console.log('Middleware 2: Response sent');
});
// রেসপন্স তৈরি করা
app.use(ctx => {
ctx.body = 'Hello from KoaJS!';
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
আউটপুট:
Middleware 1: Request received
Middleware 2: Request received
Middleware 2: Response sent
Middleware 1: Response sent
এখানে, await next() ব্যবহার করা হয়েছে, যার মাধ্যমে প্রথম মিডলওয়্যারটি শেষ হয়ে, পরবর্তী মিডলওয়্যার চালানো হয়। এটি অ্যাসিনক্রোনাস কার্যকারিতা সহজ করে এবং KoaJS অ্যাপ্লিকেশনের ফ্লো কন্ট্রোলকে পরিষ্কার রাখে।
Async/Await এর সুবিধা
- এনকোডিং এবং ডিবাগিং সহজ:
async/awaitব্যবহারের ফলে অ্যাসিনক্রোনাস কোড আরও সহজ এবং প্রাঞ্জল হয়, যা কোডের পাঠযোগ্যতা বাড়ায়। - পুনরায় ব্যাবহারযোগ্য কোড: অ্যাসিনক্রোনাস অপারেশনগুলো অপেক্ষার সময়ে পরবর্তী মিডলওয়্যার কল করার জন্য
await next()ব্যবহার করা হয়, যা কোড পুনরায় ব্যবহারের সুযোগ প্রদান করে। - পাশাপাশি কোডিং স্টাইল: অ্যাসিনক্রোনাস কোড সহজেই একইভাবে লেখা যায়, যেমন সিঙ্ক্রোনাস কোড। এটি ত্রুটি পরিচালনাকে সহজ করে।
একটি কাস্টম মিডলওয়্যার তৈরি করা Async/Await দিয়ে
ধরা যাক, আপনি একটি কাস্টম মিডলওয়্যার তৈরি করতে চান যা কোনো ওয়েবসাইটে রিকোয়েস্ট আসার আগে কিছু ওয়েব সার্ভিস থেকে ডেটা ফেচ করবে। এটি করা যেতে পারে async/await দিয়ে, যেখানে সার্ভিস থেকে ডেটা লোড হওয়া পর্যন্ত পরবর্তী মিডলওয়্যার বা রেসপন্স হ্যান্ডলিং অপেক্ষা করবে।
উদাহরণ: কাস্টম ডেটা ফেচ মিডলওয়্যার
const Koa = require('koa');
const axios = require('axios'); // HTTP রিকোয়েস্ট পাঠানোর জন্য axios ব্যবহার করা
const app = new Koa();
// কাস্টম মিডলওয়্যার যা অ্যাসিনক্রোনাস ডেটা ফেচ করবে
app.use(async (ctx, next) => {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1'); // API কল
ctx.state.post = response.data; // API থেকে ডেটা নিয়ে ctx.state তে সংরক্ষণ
await next(); // পরবর্তী মিডলওয়্যার কল করা
} catch (err) {
ctx.status = 500;
ctx.body = 'Failed to fetch data';
}
});
// রেসপন্স তৈরি করা
app.use(ctx => {
ctx.body = {
message: 'Post Data',
data: ctx.state.post, // ctx.state থেকে ডেটা পাওয়া
};
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে, প্রথম মিডলওয়্যারটি axios ব্যবহার করে একটি API থেকে ডেটা ফেচ করছে। await next() কল করার মাধ্যমে পরবর্তী মিডলওয়্যার অপেক্ষা করছে যতক্ষণ না API থেকে ডেটা লোড হয়ে আসছে।
আউটপুট:
{
message: "Post Data",
data: {
userId: 1,
id: 1,
title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
body: "quia et suscipit\nsuscipit ..."
}
}
এখানে API থেকে ডেটা সফলভাবে ফেচ করে ctx.state তে সংরক্ষণ করা হচ্ছে এবং পরবর্তী মিডলওয়্যার এই ডেটা ব্যবহার করছে।
Async/Await এবং Error Handling
KoaJS-এ async/await ব্যবহার করার সময়, ত্রুটি হ্যান্ডলিং খুবই গুরুত্বপূর্ণ। try...catch ব্লক ব্যবহার করে অ্যাসিনক্রোনাস ত্রুটি সঠিকভাবে হ্যান্ডল করা যায়। নিচে একটি উদাহরণ দেওয়া হলো যেখানে async/await এবং try...catch ব্যবহার করা হয়েছে।
উদাহরণ: Error Handling
app.use(async (ctx, next) => {
try {
const response = await axios.get('https://invalid-api.com/posts/1'); // ভুল API URL
ctx.body = response.data;
} catch (err) {
ctx.status = 500; // HTTP 500 স্ট্যাটাস
ctx.body = { message: 'Failed to fetch data', error: err.message };
}
});
এখানে, যদি axios এর মাধ্যমে কোনো ত্রুটি ঘটে, তবে catch ব্লকটি ত্রুটির বার্তা সহ 500 স্ট্যাটাস কোড পাঠাবে।
সারাংশ
KoaJS-এ async/await ব্যবহারের মাধ্যমে মিডলওয়্যার খুব সহজে এবং পরিষ্কারভাবে অ্যাসিনক্রোনাস কার্যক্রম পরিচালনা করা যায়। এটি কোডের পাঠযোগ্যতা এবং কার্যকারিতা বাড়ায়। await next() ব্যবহারের মাধ্যমে মিডলওয়্যার চেইন তৈরি করা হয়, যেখানে প্রতিটি মিডলওয়্যার পরবর্তী মিডলওয়্যার বা রিকোয়েস্ট হ্যান্ডলার অপেক্ষা করে। এই প্রক্রিয়া KoaJS অ্যাপ্লিকেশন ডেভেলপমেন্টকে আরও কার্যকরী এবং নমনীয় করে তোলে।