ExpressAdvanced
Real-world Express Project
পূর্ণ Task Manager API — auth, CRUD, validation, security সহ সম্পূর্ণ Express project বাংলায়।
12টি অংশবাংলা ভাষায়
চলুন একটি Task Manager API বানাই — যেখানে auth, CRUD, validation, security — সব থাকবে। এটি একটি realistic mini-project।
Packages
npm init -y
npm install express mongoose bcryptjs jsonwebtoken dotenv cors helmet
npm install --save-dev nodemon
# structure create করুন
mkdir -p src/{config,models,controllers,routes,middleware,validators}app.js
src/app.jsjavascript
javascript
require("dotenv").config();
const express = require("express");
const cors = require("cors");
const helmet = require("helmet");
const app = express();
app.use(helmet());
app.use(cors());
app.use(express.json());
app.get("/", (req, res) => res.json({ message: "Task API" }));
app.use("/api/auth", require("./routes/auth"));
app.use("/api/tasks", require("./routes/tasks"));
// 404
app.use((req, res) => res.status(404).json({ error: "Not found" }));
// error handler
app.use((err, req, res, next) => {
console.error(err);
res.status(err.status || 500).json({ error: err.message || "Server error" });
});
module.exports = app;models/Task.js
src/models/Task.jsjavascript
javascript
const mongoose = require("mongoose");
const taskSchema = new mongoose.Schema({
title: { type: String, required: true, trim: true, maxlength: 100 },
description: { type: String, default: "", maxlength: 500 },
completed: { type: Boolean, default: false },
priority: {
type: String,
enum: ["low", "medium", "high"],
default: "medium",
},
user: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
createdAt: { type: Date, default: Date.now },
});
module.exports = mongoose.model("Task", taskSchema);routes/tasks.js
src/routes/tasks.jsjavascript
javascript
const express = require("express");
const router = express.Router();
const Task = require("../models/Task");
const { protect } = require("../middleware/auth");
const { validateTask } = require("../validators/taskValidator");
// সব middleware এই router-এ
router.use(protect);
// GET /api/tasks
router.get("/", async (req, res, next) => {
try {
const tasks = await Task.find({ user: req.user._id }).sort("-createdAt");
res.json(tasks);
} catch (err) { next(err); }
});
// POST /api/tasks
router.post("/", validateTask, async (req, res, next) => {
try {
const task = await Task.create({ ...req.body, user: req.user._id });
res.status(201).json(task);
} catch (err) { next(err); }
});
// PATCH /api/tasks/:id
router.patch("/:id", async (req, res, next) => {
try {
const task = await Task.findOneAndUpdate(
{ _id: req.params.id, user: req.user._id }, // own task only
req.body,
{ new: true, runValidators: true }
);
if (!task) return res.status(404).json({ error: "Task খুঁজে পাওয়া যায়নি" });
res.json(task);
} catch (err) { next(err); }
});
// DELETE /api/tasks/:id
router.delete("/:id", async (req, res, next) => {
try {
const task = await Task.findOneAndDelete({
_id: req.params.id,
user: req.user._id,
});
if (!task) return res.status(404).json({ error: "Task খুঁজে পাওয়া যায়নি" });
res.json({ message: "Task মুছে ফেলা হয়েছে" });
} catch (err) { next(err); }
});
module.exports = router;Test Flow
# 1. run server
node src/server.js
# 2. register (Postman/Bruno)
POST http://localhost:5000/api/auth/register
{ "name":"রহিম", "email":"rahim@test.com", "password":"123456" }
# 3. login → token
POST http://localhost:5000/api/auth/login
{ "email":"rahim@test.com", "password":"123456" }
→ { "token": "eyJ..." }
# 4. create task (auth header)
POST http://localhost:5000/api/tasks
Authorization: Bearer eyJ...
{ "title":"Node.js শিখি", "priority":"high" }
# 5. get tasks
GET http://localhost:5000/api/tasks
Authorization: Bearer eyJ...আরও কাজ
এই project-এ আরও যোগ করুন: user-এর task-দৈর্ঘ্য প্রম্পট, category/filter, due date, analytics। তারপর GitHub-এ push করে portfolio build করুন।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।