express.Router() tạo mini-app với routes và middleware riêng biệt — giải pháp chính để tổ chức code theo feature.
- Mounting pattern:
app.use('/api/v1/users', userRouter)prefix tất cả routes trong router. - Route-level middleware:
router.use(authMiddleware)chỉ áp dụng cho routes trong router đó. - Nested routers:
adminRouter.use('/users', adminUserRouter)để nest sâu hơn. - Versioned API pattern:
app.use('/api/v1', v1Router); app.use('/api/v2', v2Router)— v1 và v2 hoàn toàn độc lập, dễ deprecate. - Cấu trúc thực tế:
routes/users.tsexport router,routes/index.tsaggregate tất cả routers,app.tschỉapp.use('/api', mainRouter).
Pitfall: router.use(middleware) sau router.get(...) thì route đó không được áp dụng middleware — phải đặt middleware TRƯỚC routes.