15.2 新增一个模块的步骤
照着这个模板,新增任何模块都很简单:
- 定义类型:
src/models/xxx/xxx.ts - 写 Model:
src/models/xxx/xxx-model.ts(CRUD 方法) - 准备数据:
src/data/xxx/index.ts(内存模式,或 Prisma 迁移) - 写 Service:
src/services/xxx/xxx-service.ts(业务逻辑) - 写 Controller:
src/controllers/xxx/xxx-controller.ts(请求处理) - 写 Router:
src/routers/xxx/xxx-router.ts(URL 映射) - 注册:在
bootstrap.ts和routers/index.ts里注册
15.3 各层之间的调用关系
HTTP 请求
│
▼
[Router] URL 匹配
│
▼
[Controller]
├─ 解析 query/params/body
├─ 调用 Service 方法
└─ 返回统一格式响应
│
▼
[Service]
├─ 参数校验
├─ 业务规则判断
├─ 调用 Model 读写数据
└─ (可能)协调多个 Model
│
▼
[Model]
└─ 操作数据存储(内存/数据库)
调用方向只能是从上到下,不能反过来。
15.4 常见问题
Q:这个架构是不是太重了,小项目用得上吗?
A:看情况。如果只是一个两三个接口的小工具,直接把逻辑写在路由处理函数里也没问题。但只要项目超过 5 个接口、需要长期维护,分层就有价值了。
Q:TypeScript 是不是必须的?
A:不是。但推荐用,尤其是中大型项目。类型系统能帮你提前发现很多 bug,重构也更有信心。
Q:为什么不用 NestJS?
A:NestJS 是很好的框架,但它约束多、学习成本高。Express + 手动分层更灵活,能让你真正理解每一层是怎么工作的。以后想换 NestJS 也能看懂它在做什么。
Q:单元测试怎么写?
A:分层架构的一个好处就是好测试。Service 层测试传 mock Model 进去就行,不用启动服务。Controller 层可以用 supertest 测。
15.5 下一步可以学什么
- 用户认证:JWT / Session / OAuth2
- 权限系统:RBAC / ABAC
- 缓存:Redis
- 消息队列:RabbitMQ / BullMQ
- 文件上传:multer
- WebSockets:Socket.IO
- 微服务:服务拆分、API 网关
- 部署:Docker / PM2 / Nginx
15.6 参考资源
教程完。祝编码愉快!