nest cli模块剖析

27 阅读1分钟

模块生成

nest g resource user --no-spec

模块结构

src/user/
├── user.controller.ts        👉 控制器
├── user.service.ts           👉 服务层
├── user.module.ts            👉 模块文件
├── dto/
│   ├── create-user.dto.ts    👉 创建用户时的数据格式约束
│   └── update-user.dto.ts    👉 更新用户时的数据格式约束
├── entities/
│   └── user.entity.ts        👉 定义“用户”这个数据结构

关系描述

             [客户端/浏览器]
                    |
                    v
       ┌────────────────────────────┐
       │  user.controller.ts        │  ←—— 接收 HTTP 请求,提取参数
       └────────────────────────────┘
                    |
                    | 调用
                    v
       ┌────────────────────────────┐
       │  user.service.ts           │  ←—— 处理业务逻辑(不操作 HTTP)
       └────────────────────────────┘
                    |
         需要结构定义/格式验证
         ┌──────────────┐
         │ DTO(2个)    │  ←—— 用户提交数据的结构限制
         │ create-user  │     例如 { username, password }
         │ update-user  │     例如 { password }
         └──────────────┘
                    |
        有需要时返回标准结构
                    ↓
         ┌─────────────────────┐
         │ user.entity.ts       │ ←—— 描述“用户”是个什么样的数据结构(字段)
         └─────────────────────┘

所有这些东西都被集中注册到:
       ┌────────────────────────────┐
       │  user.module.ts            │ ←—— 模块定义,注册 Controller + Service
       └────────────────────────────┘
                    |
 注册到主程序的模块入口:
                    ↓
       ┌────────────────────────────┐
       │  app.module.ts             │ ←—— 应用根模块,加载所有功能模块
       └────────────────────────────┘


文件作用举例比喻
user.controller.ts路由入口,收到请求后调用 service 处理服务员,点菜的入口
user.service.ts执行实际逻辑,比如“查用户有没有注册”厨师,真正干活的人
create-user.dto.ts定义“注册新用户”时应该传哪些字段(校验规则也写这里)点菜表的格式
update-user.dto.ts定义“更新用户”时的数据结构修改菜单项的格式
user.entity.ts描述“用户”这个概念,包括字段、类型菜单上这道菜长啥样
user.module.ts把 controller + service 组合注册成一个“功能包”餐厅里的厨师 + 服务员归在一个厨房模块里
app.module.ts项目主模块,把所有模块都挂进来总前台,决定哪个厨房负责做哪个菜