管道

转换/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
  }
}