Nestjs 中的管道

发布于 2021-04-19  253 次阅读


1、创建管道
nest g pipe user
管道创建完成后生成如下代码:

import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class UserPipe implements PipeTransform {
    transform(value: any, metadata: ArgumentMetadata) {
    //这个里面可以修改传入的值以及验证转入值的合法性
    return value;
  }
}

2、使用管道

import { Controller,Get,UsePipes,Query} from '@nestjs/common';
import {UserPipe} from '../../user.pipe';
@Controller('user')
export class UserController {
@Get()
index(){
  return '用户页面';
}
@Get('pipe')
@UsePipes(new UserPipe())
pipe(@Query() info){
  console.log(info);
  return `this is Pipe`;
}
}

三、 Nestjs 中管道结合 Joi 库实现数据验证

Joi 库: https://github.com/hapijs/joi

import { ArgumentMetadata, Injectable, PipeTransform, BadRequestException } from '@nestjs/common';

import * as Joi from 'joi';

@Injectable()
export class ArticlePipe implements PipeTransform {
  constructor(private readonly schema) { }
  transform(value: any, metadata: ArgumentMetadata) {
    console.log("pipe-管道拿到的数据", value);
    // const { error } = Joi.validate(value, this.schema)
    const { error } = this.schema.validate(value)

    console.log(error);
    if (error) {
      throw new BadRequestException(error.details[0].message)
      // throw new BadRequestException(error)
    }

    return value;
  }
}
import * as Joi from 'joi';
let rootInfo = Joi.object({
  name: Joi.string().required(),
  age: Joi.number().integer().min(6).max(66).required(),
  id: Joi.string().min(6).max(66),
}).unknown();


@Get('pipe')
  @UsePipes(new ArticlePipe(rootInfo))
  pipe(@Query() info) {
    console.log('info--管道', info);
    return 'info'
  }

  @Post('pipe2')
  @UsePipes(new ArticlePipe(rootInfo))
  pipe2(@Query() info) {
    console.log('info--管道', info);
    return 'info'
  }
unknown() 是不用验证未知数据的


注错之当