控制器
概念
Controller 负责处理入站 HTTP 请求并返回响应。它是 NestJS 的"门口接待员"——接收请求、调用服务、返回结果。
路由装饰器
typescript
import { Controller, Get, Post, Put, Delete, Param, Query, Body, HttpCode } from '@nestjs/common'
@Controller('users') // 路由前缀 /users
export class UsersController {
@Get()
findAll(@Query('page') page?: number) {
// GET /users?page=1
return this.usersService.findAll(page)
}
@Get(':id')
findOne(@Param('id') id: string) {
// GET /users/42
return this.usersService.findOne(id)
}
@Post()
@HttpCode(201)
create(@Body() createUserDto: CreateUserDto) {
// POST /users
return this.usersService.create(createUserDto)
}
@Put(':id')
update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
// PUT /users/42
return this.usersService.update(id, updateUserDto)
}
@Delete(':id')
remove(@Param('id') id: string) {
// DELETE /users/42
return this.usersService.remove(id)
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
请求参数提取
| 装饰器 | 提取来源 | 示例 |
|---|---|---|
@Param('id') | 路由参数 | /users/:id |
@Query('page') | 查询字符串 | ?page=1 |
@Body() | 请求体 | POST/PUT body |
@Headers('token') | 请求头 | |
@Req() | 完整请求对象 | NestJS 包装的 Request |
@Res() | 完整响应对象 | 需手动处理响应 |
DTO(Data Transfer Object)
定义请求数据的类型和校验:
typescript
import { IsString, IsEmail, IsInt, Min, Max, IsOptional } from 'class-validator'
export class CreateUserDto {
@IsString()
name: string
@IsEmail()
email: string
@IsInt()
@Min(0)
@Max(150)
age: number
@IsOptional()
@IsString()
avatar?: string
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
控制器最佳实践
- Controller 只做路由和请求处理,不包含业务逻辑
- 业务逻辑放在 Service 中
- 善用 DTO + ValidationPipe 自动校验
- 返回值和参数都用 TypeScript 类型标注
面试常问
- Controller 的职责是什么?和 Service 如何分工?
- @Param 和 @Query 的区别?
- DTO 的作用?如何让校验自动生效?
