15 — 项目结构总览

2 阅读2分钟

15.2 新增一个模块的步骤

照着这个模板,新增任何模块都很简单:

  1. 定义类型src/models/xxx/xxx.ts
  2. 写 Modelsrc/models/xxx/xxx-model.ts(CRUD 方法)
  3. 准备数据src/data/xxx/index.ts(内存模式,或 Prisma 迁移)
  4. 写 Servicesrc/services/xxx/xxx-service.ts(业务逻辑)
  5. 写 Controllersrc/controllers/xxx/xxx-controller.ts(请求处理)
  6. 写 Routersrc/routers/xxx/xxx-router.ts(URL 映射)
  7. 注册:在 bootstrap.tsrouters/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 参考资源


教程完。祝编码愉快!