MongoDBAdvanced
Express + Mongoose REST API
Express দিয়ে Mongoose-ভিত্তিক পূর্ণাঙ্গ REST API — route, controller, model — বাংলায়।
10টি অংশবাংলা ভাষায়
প্রজেক্ট কাঠামো
Folder structuretext
text
my-api/
├── models/
│ └── User.js
├── routes/
│ └── users.js
├── db.js
├── server.js
└── package.jsonModel + db
models/User.jsjs
js
import mongoose from "mongoose";
const userSchema = new mongoose.Schema(
{
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: Number,
},
{ timestamps: true }
);
export default mongoose.model("User", userSchema);db.jsjs
js
import mongoose from "mongoose";
export async function connectDB(uri) {
await mongoose.connect(uri);
console.log("MongoDB connected");
}Routes + Controller
routes/users.jsjs
js
import { Router } from "express";
import User from "../models/User.js";
const router = Router();
// GET /api/users — সব user (pagination সহ)
router.get("/", async (req, res, next) => {
try {
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 10;
const [users, total] = await Promise.all([
User.find().skip((page - 1) * limit).limit(limit).lean(),
User.countDocuments(),
]);
res.json({ users, total, page });
} catch (err) {
next(err);
}
});
// GET /api/users/:id
router.get("/:id", async (req, res, next) => {
try {
const user = await User.findById(req.params.id).lean();
if (!user) return res.status(404).json({ message: "User নেই" });
res.json(user);
} catch (err) {
next(err);
}
});
// POST /api/users
router.post("/", async (req, res, next) => {
try {
const user = await User.create(req.body);
res.status(201).json(user);
} catch (err) {
next(err);
}
});
// PATCH /api/users/:id
router.patch("/:id", async (req, res, next) => {
try {
const user = await User.findByIdAndUpdate(req.params.id, req.body, {
new: true,
runValidators: true,
});
if (!user) return res.status(404).json({ message: "User নেই" });
res.json(user);
} catch (err) {
next(err);
}
});
// DELETE /api/users/:id
router.delete("/:id", async (req, res, next) => {
try {
const deleted = await User.findByIdAndDelete(req.params.id);
if (!deleted) return res.status(404).json({ message: "User নেই" });
res.sendStatus(204);
} catch (err) {
next(err);
}
});
export default router;Server
server.jsjs
js
import express from "express";
import { connectDB } from "./db.js";
import usersRouter from "./routes/users.js";
const app = express();
app.use(express.json());
app.use("/api/users", usersRouter);
// কেন্দ্রীয় error handler
app.use((err, req, res, next) => {
if (err.name === "ValidationError") {
return res.status(400).json({ message: "Validation failed" });
}
if (err.code === 11000) {
return res.status(409).json({ message: "Duplicate value" });
}
res.status(500).json({ message: "Internal server error" });
});
const PORT = process.env.PORT || 3000;
await connectDB(process.env.MONGODB_URI);
app.listen(PORT, () => console.log("Server on", PORT));runValidators
findByIdAndUpdate-এ schema validation চালাতে `{ runValidators: true }` অপরিহার্য — না দিলে required/enum ইত্যাদি check হয় না।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।