nest的管道类似于vue2中的过滤器( | ),主要用于数据转换(将从前端传过来的数据转成我们想要的数据),也可以用于验证(类似于前端的rules 配置验证规则)
1、数据转换
nest的8个内置的转换API
ValidationPipeParseIntPipeParseFloatPipeParseBoolPipeParseArrayPipeParseUUIDPipeParseEnumPipeDefaultValuePipe
import { Controller, Get, Post, Body, Patch, Param, Delete, ParseIntPipe, ParseUUIDPipe } from '@nestjs/common';
import { PipeService } from './pipe.service';
import { CreatePipeDto } from './dto/create-pipe.dto';
import { UpdatePipeDto } from './dto/update-pipe.dto';
import * as uuid from 'uuid'
// console.log(uuid.v1());
@Controller('pipe')
export class PipeController {
constructor(private readonly pipeService: PipeService) {}
@Get(':id')
//ParseIntPipe的意思是,我们想要的是number类型的数据,但前端传给我们的不是number类型的数据,ParseIntPipe帮我们将传过来的数据转成number类型的数据
findOne(@Param('id',ParseIntPipe) id: number) {
console.log(typeof id),'=============>';
return this.pipeService.findOne(+id);
}
}
2、数据校验
需要先提前安装两个包
npm i --save class-validator class-transformer
进入需要进行数据校验的模块(我以login为例)
cd src/login
新建pi文件
nest g pi login
在login.controller.ts文件中
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { LoginService } from './login.service';
import { CreateLoginDto } from './dto/create-login.dto';
import { UpdateLoginDto } from './dto/update-login.dto';
//引入LoginPipe
import {LoginPipe} from './login/login.pipe'
@Controller('login')
export class LoginController {
constructor(private readonly loginService: LoginService) {}
@Post()
//在body装饰器里面使用LoginPipe
create(@Body(LoginPipe) createLoginDto: CreateLoginDto) {
return this.loginService.create(createLoginDto);
}
}
在/login/login.pipe.ts中
import { ArgumentMetadata, HttpException, HttpStatus, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate, Validate } from 'class-validator';
@Injectable()
export class LoginPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
// console.log(value,metadata);
const DTO = plainToInstance(metadata.metatype,value)
const errs = await validate(DTO)
console.log( errs );
if(errs.length){
throw new HttpException(errs,HttpStatus.BAD_REQUEST)
}
return value;
}
}
在dto/create-pipe.dto.ts中
import { IsNotEmpty, IsNumber, IsString, Length } from "class-validator";
export class CreateLoginDto {
@IsNotEmpty()
@IsString()
@Length(5,10,{
message:'不能大于10'
})
name:string;
@IsNumber()
age:number
}
数据校验的另一种更简单的方式,使用nest内置的ValidationPipe,不需要使用管道
不需要在controller.ts添加其他类
在main.ts中
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';
import * as cors from 'cors'
import { VersioningType,ValidationPipe } from '@nestjs/common';
import {Request,Response,NextFunction} from 'express'
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
// 响应拦截器
import { ResponseInterceptor } from './common/Response'
// 异常拦截器
import { HttpFilter } from './common/Filter'
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
// 使用响应拦截器
app.useGlobalInterceptors(new ResponseInterceptor())
// 使用异常拦截器
app.useGlobalFilters(new HttpFilter())
//数据校验
app.useGlobalPipes(new ValidationPipe())
await app.listen(3000);
}
bootstrap();