nest管道(pipe)

177 阅读2分钟

nest的管道类似于vue2中的过滤器( | ),主要用于数据转换(将从前端传过来的数据转成我们想要的数据),也可以用于验证(类似于前端的rules 配置验证规则)

1、数据转换

nest的8个内置的转换API
  • ValidationPipe
  • ParseIntPipe
  • ParseFloatPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • ParseEnumPipe
  • DefaultValuePipe
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();