Modular System Layer তৈরি করুন TypeScript, Node.js, Express, and Mongoose দিয়ে
Mohammad Farhad Tanveer
Posted on November 26, 2024
পরিচিতি
মডিউলার আর্কিটেকচার একটি সফটওয়্যার ডিজাইন প্যাটার্ন, যেখানে আলাদা আলাদা ফাংশনালিটি বা ফিচার ভিন্ন ভিন্ন মডিউল আকারে তৈরি করা হয়। এই ডকুমেন্টেশনটি আপনার TypeScript, Node.js, Express, এবং Mongoose দিয়ে কীভাবে একটি মডিউলার সিস্টেম লেয়ার তৈরি করবেন তা ধাপে ধাপে ব্যাখ্যা করবে। এখানে আমরা user
মডিউল তৈরি করার প্রক্রিয়া দেখাবো।
১. প্রজেক্ট সেটআপ
প্রথমে একটি নতুন প্রজেক্ট তৈরি করুন।
প্রজেক্ট ইনিশিয়ালাইজ করুন:
mkdir modular-system
cd modular-system
npm init -y
প্রয়োজনীয় প্যাকেজ ইনস্টল করুন:
npm install express mongoose zod
npm install -D typescript @types/node @types/express ts-node-dev
TypeScript কনফিগার করুন:
ts --init
tsconfig.json
ফাইলে নিচের পরিবর্তন করুন:
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
}
}
২. ফোল্ডার স্ট্রাকচার
প্রজেক্টের ফোল্ডার স্ট্রাকচার তৈরি করুন:
src/
|-- modules/
| |-- user/
|-- user.interface.ts // make an TS interface/type for specific model
| |-- user.model.ts // create schema from type and then make a model
| |-- user.controller.ts // handle req/res only
| |-- user.service.ts // habdle business logic or query
| |-- user.zod.validation.ts // third party extension to handle validation
| |-- user.router.ts // make route and connect it into userController.
|-- app.ts
|-- server.ts
৩. user
মডিউল তৈরি
(১) user.model.ts
এই ফাইলটি ডাটাবেস মডেল তৈরি করতে ব্যবহৃত হয়। এখানে আমরা Mongoose
ব্যবহার করে একটি Schema
এবং মডেল ডিফাইন করেছি, যা ডাটার স্ট্রাকচার নির্দেশ করে। এটি নিশ্চিত করে যে ডাটাবেসে সঠিক ডাটা ফরম্যাট সঞ্চয় হচ্ছে। উদাহরণস্বরূপ, user
মডেলটি নাম, ইমেল, এবং পাসওয়ার্ডের মতো ফিল্ড নিয়ে গঠিত।
Mongoose
ব্যবহার করে একটি মডেল তৈরি করুন।
import { Schema, model } from 'mongoose';
// we can make it into different file as name user.interface.ts
interface IUser {
name: string;
email: string;
password: string;
}
const userSchema = new Schema<IUser>({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
export const User = model<IUser>('User', userSchema);
(২) user.service.ts
Service ফাইলের কাজ মূল ব্যবসায়িক লজিক পরিচালনা করা। এটি মূলত মডিউল এবং ডাটার মধ্যে যোগাযোগ স্থাপন করে। এই ফাইলে সাধারণত ডাটাবেস কোয়েরি এবং ডাটার ম্যানিপুলেশন সম্পর্কিত কার্যক্রম থাকে। উদাহরণস্বরূপ, user.service.ts
ফাইলটি User
মডেলের মাধ্যমে ডাটাবেসে নতুন ইউজার তৈরি করা এবং ইউজারদের ডাটা রিটার্ন করার কাজ করে। এটি কন্ট্রোলারের সাথে কাজ করে, যেখানে কন্ট্রোলার শুধুমাত্র HTTP রিকোয়েস্ট হ্যান্ডল করে এবং সঠিক সার্ভিস ফাংশনকে কল করে।
ব্যবসায়িক লজিক এখানে থাকবে।
import { User } from './user.model';
export const createUser = async (userData: IUser) => {
const user = await User.create(userData);
return user;
};
export const getUsers = async () => {
return await User.find();
};
(৩) user.controller.ts
Controller ফাইলের কাজ হল HTTP রিকোয়েস্ট হ্যান্ডল করা। এটি ক্লায়েন্ট থেকে আসা রিকোয়েস্ট গ্রহণ করে এবং উপযুক্ত সার্ভিস ফাংশন কল করে। সার্ভিস থেকে প্রাপ্ত ডাটা প্রক্রিয়াজাত করে এবং ক্লায়েন্টের কাছে রেসপন্স পাঠায়। উদাহরণস্বরূপ, এখানে একটি POST
রিকোয়েস্ট নতুন ইউজার তৈরি করার জন্য সার্ভিসকে ডাকে এবং সার্ভিস থেকে রিটার্ন পাওয়া ডাটাকে JSON আকারে রেসপন্স করে। এছাড়া, GET
রিকোয়েস্ট ব্যবহারকারীদের ডাটার তালিকা রিটার্ন করে।
HTTP রিকোয়েস্ট হ্যান্ডেল করতে ব্যবহার করুন।
import { Request, Response } from 'express';
import { createUser, getUsers } from './user.service';
export const createUserController = async (req: Request, res: Response) => {
try {
const user = await createUser(req.body);
res.status(201).json(user);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
export const getUsersController = async (req: Request, res: Response) => {
try {
const users = await getUsers();
res.status(200).json(users);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
(৪) user.zod.validation.ts
Zod validation ফাইলটি ইনপুট যাচাই করার জন্য ব্যবহৃত হয়। এটি ডাটার গঠন এবং ধরণ নিশ্চিত করে, যেমন নাম, ইমেল, এবং পাসওয়ার্ডের জন্য নির্দিষ্ট শর্ত। এটি গুরুত্বপূর্ণ কারণ এটি ক্লায়েন্টের পাঠানো ভুল বা ক্ষতিকর ডাটা সার্ভারে প্রবেশ করতে বাধা দেয়। সিকিউরিটি বৃদ্ধি পায় কারণ এটি ডাটাবেসে সংরক্ষণ করার আগেই ইনপুট যাচাই করে এবং পোটেনশিয়াল বাগ বা সাইবার আক্রমণ থেকে সিস্টেমকে সুরক্ষিত রাখে। উদাহরণস্বরূপ, createUserSchema
নিশ্চিত করে যে নাম খালি নয়, ইমেল সঠিক ফরম্যাটে রয়েছে, এবং পাসওয়ার্ড ন্যূনতম ৬ অক্ষরের।
ইনপুট ভ্যালিডেশন Zod
দিয়ে করুন।
import { z } from 'zod';
export const createUserSchema = z.object({
body: z.object({
name: z.string().min(1, 'Name is required'),
email: z.string().email('Invalid email address'),
password: z.string().min(6, 'Password must be at least 6 characters'),
}),
});
(৫) user.routes.ts
রাউটার তৈরি করুন।
import express from 'express';
import { createUserController, getUsersController } from './user.controller';
const router = express.Router();
router.post('/', createUserController);
router.get('/', getUsersController);
export const UserRoutes = router;
৪. app.ts
ফাইল
app.ts
ফাইলে Express অ্যাপ তৈরি করুন।
import express, { Application } from 'express';
import mongoose from 'mongoose';
import { UserRoutes } from './modules/user/user.router';
const app: Application = express();
app.use(express.json());
// Routes
app.use('/api/users', UserRoutes);
export default app;
৫. server.ts
ফাইল
সার্ভার চালু করার জন্য server.ts
তৈরি করুন।
import app from './app';
const PORT = 5000;
const DATABASE_URL = 'mongodb://localhost:27017/modular_system';
app.listen(PORT, async () => {
console.log(`Server is running on port ${PORT}`);
try {
await mongoose.connect(DATABASE_URL);
console.log('Database connected');
} catch (error) {
console.error('Database connection failed:', error);
}
});
৬. প্রজেক্ট রান করুন
প্রজেক্ট চালানোর জন্য package.json
-এ স্ক্রিপ্ট যোগ করুন:
"scripts": {
"start": "ts-node-dev src/server.ts"
}
প্রজেক্ট চালু করুন:
npm start
উপসংহার
উপরের ধাপগুলো অনুসরণ করে, আপনি একটি মডিউলার সিস্টেম লেয়ার তৈরি করতে পারবেন। ভবিষ্যতে নতুন মডিউল তৈরি করতে হলে এই একই ধাপগুলো অনুসরণ করুন।
Posted on November 26, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.