管道
原创...大约 1 分钟
管道是用 @Injectable()
装饰器注释的类,它实现了 PipeTransform
接口。
管道有两个典型的用例
- transformation: 将输入数据转换为所需的形式(例如,从字符串到整数)
- validation: 评估输入数据,如果有效,只需将其原样传递; 否则抛出异常
在这两种情况下,管道都在由 控制器路由处理器 处理的 arguments
上运行。 Nest 在调用方法之前插入一个管道,管道接收指定给该方法的参数并对它们进行操作。 任何转换或验证操作都会在此时发生,之后会使用任何(可能)转换的参数调用路由处理程序。
Nest 附带了许多内置管道,你可以开箱即用。 你还可以构建自己的自定义管道。
Nest 附带九个开箱即用的管道
- ValidationPipe
- ParseIntPipe
- ParseFloatPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- ParseEnumPipe
- DefaultValuePipe
- ParseFilePipe
它们是从 @nestjs/common
包中导出的。
使用管道
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) { }
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return {
num: id
}
}
}
此时,我们访问http://localhost:3000/user/1
可以看到返回信息,访问http://localhost:3000/user/a
就看不到正常的返回信息了,提示"Validation failed (numeric string is expected)"
该异常将阻止 findOne()
方法的主体执行。
提示
注意返回的num
的类型,使用管道@Param('id', ParseIntPipe) id: number
,返回的是数字类型,而不使用管道转换则@Param('id') id: number
则返回的num是字符串类型
Powered by Waline v2.15.7