管道
转换/UUID/验证
转换
// ValidationPipe
// ParseIntPipe
// ParseFloatPipe
// ParseBoolPipe
// ParseArrayPipe
// ParseUUIDPipe
// ParseEnumPipe
// DefaultValuePipe
@Get('id/:id')
findOne(@Param('id', ParseIntPipe) id: number) {
return `this is ${id}`
}
UUID
npm install uuid
npm install @types/uuid -D
import v4 from 'uuid'
console.log(v4())
验证
参数级管道 @@11
login.controller
文件部分
import {LoginPipe} from './login.pipe'
import {CreateLogin Dto} from './dto/create-lgin.dto'
aaa(@body('id',LoginPipe) bbb: CreateLoginDto){}
方法级管道
login.controller
文件部分
@Post()
@UsePipes(LoginPipe) // 应用到整个方法
login(@Body() body: CreateLoginDto) {}
控制器级管道 @@10
login.controller
文件部分
@Controller('auth')
@UsePipes(LoginPipe) // 应用到整个控制器
export class AuthController {
@Post('login')
login(@Body() body: CreateLoginDto) {}
@Post('register')
register(@Body() body: CreateUserDto) {}
}
全局管道验证 @@9
main.ts
文件部分
import { ValidationPipe } from '@nestjs/common'
app.useGlobalPipes(new ValidationPipe())
通用
安装第验证包
nest g pi login
npm install class-validator class-transformer
create-login.dto.ts
文件部分
import { IsNotEmpty, IsNumber, IsString, Length } from 'class-validator'
export class CreateLoginDto {
@IsNotEmpty()
@IsString({
message: '必须为字符串',
})
@Length(5, 10)
name: string
@IsNumber()
age: number
}
login.pipe.ts
文件部分,例子。
import { ArgumentMetadata, HttpException, HttpStatus, Injectable, PipeTransform } from '@nestjs/common'
import { plainToInstance } from 'class-transformer'
import { validate } from 'class-validator'
@Injectable()
export class LoginPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
//value 请求传递的值
//metadata
// - metatype:使用的验证类
// - type:在什么装饰器调用
// - data:装饰器限制的值
const DTO = plainToInstance(metadata.metatype, value)
const errors = await validate(DTO)
if (errors.length) {
throw new HttpException(errors, HttpStatus.BAD_REQUEST)
}
return value
}
}