ExpressAdvanced
RESTful API Design with Express
REST principles, best practices, pagination, filtering, responses — Express API বাংলায়।
12টি অংশবাংলা ভাষায়
REST API মানে HTTP via resources represent করা। Express-এ সঠিকভাবে API design করা শিখে নিন।
REST Principles
- Resources noun-এ নাম দিন —
/users,/posts(verb নয়) - HTTP methods দিয়ে operation বোঝান — GET/POST/PUT/DELETE
- Nested resources —
/users/:id/posts - Status codes সঠিকভাবে ব্যবহার করুন
- Versioning —
/api/v1/users
Pagination
router.get("/", async (req, res, next) => {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 10;
const skip = (page - 1) * limit;
const [total, users] = await Promise.all([
User.countDocuments(),
User.find().skip(skip).limit(limit),
]);
res.json({
data: users,
pagination: {
page,
limit,
total,
totalPages: Math.ceil(total / limit),
hasNext: page * limit < total,
},
});
});Filtering & Sorting
// GET /api/products?category=books&minPrice=100&sort=-price
router.get("/", async (req, res, next) => {
const { category, minPrice, maxPrice, sort } = req.query;
const query = {};
if (category) query.category = category;
if (minPrice || maxPrice) {
query.price = {};
if (minPrice) query.price.$gte = Number(minPrice);
if (maxPrice) query.price.$lte = Number(maxPrice);
}
const sortObj = {};
if (sort) {
sort.split(",").forEach(field => {
const key = field.startsWith("-") ? field.slice(1) : field;
sortObj[key] = field.startsWith("-") ? -1 : 1;
});
}
const products = await Product.find(query).sort(sortObj);
res.json({ count: products.length, products });
});Consistent Response Format
// success response
const sendSuccess = (res, data, status = 200) => {
res.status(status).json({ success: true, data });
};
const sendError = (res, message, status = 400, details) => {
res.status(status).json({
success: false,
message,
...(details && { details }),
});
};
router.get("/:id", async (req, res, next) => {
const user = await User.findById(req.params.id);
if (!user) return sendError(res, "User পাওয়া যায়নি", 404);
sendSuccess(res, user);
});Versioning
// Version 1
app.use("/api/v1/users", userRoutesV1);
// Version 2 (বদল হলে)
app.use("/api/v2/users", userRoutesV2);
// কিংবা route handler-এ
const apiV1 = express.Router();
const apiV2 = express.Router();
apiV1.get("/users", handlerV1);
apiV2.get("/users", handlerV2);
app.use("/v1", apiV1);
app.use("/v2", apiV2);API Tools
API test-এর জন্য Postman বা Bruno ব্যবহার করুন। Documentation-এর জন্য Swagger / OpenAPI।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।