#1. 把 Controller 写成全能上帝类
表现:
- 直接查数据库
- 直接写鉴权
- 直接处理异常
- 直接做响应包装
后果:柜台兼调度塔台兼仓库管理员,迟早炸。
#2. 模块划分按“技术层”而不是按“业务分区”
例如:
controllers/
services/
repositories/
dto/这种平铺结构在项目一大就会散掉。
更稳的是按业务模块拆:
flights/
passengers/
auth/
payments/#3. DTO 不做校验,类型只停留在编译期
TypeScript 类型不会自动保护运行时请求。
没有 ValidationPipe,外部脏数据照样能进。
#4. 把 Guard、Pipe、Interceptor、Filter 职责混掉
别这样:
- Guard 里做 DTO 清洗
- Pipe 里做授权
- Interceptor 里做业务审批
- Filter 里吞掉所有错误假装成功
#5. 一上来就全局 @Global() 到处开
全局模块能少量用,但不要把整个机场都做成“谁都能随便拿”。
#6. 数据层两套心智混用
今天 TypeORM repository,明天 Prisma client,后天再直接裸 SQL。
系统会越来越难维护。
#7. 业务异常都用 Error
应该优先抛语义明确的 HTTP 异常,或你自己的业务异常。
#8. 配置写死
数据库、JWT、第三方服务地址都必须走配置系统。
#9. 只写 happy path,不写测试
这意味着机场只演练“晴天准点起飞”,完全不演练延误、故障和安检失败。
#10. 迷信 decorator,忽略边界设计
Decorator 只是挂点。
真正值钱的是:
- 谁依赖谁
- 谁对外暴露什么
- 哪一层负责什么