nestjs Joi验证详细教程

简介

参数验证一直都是让后端狗比较蛋疼的事情, 最近在学nestjs, 发现这里边使用管道加Joi验证比较舒适, 记录一下

教程

1. 安装

npm install --save @hapi/joi
npm install --save-dev @types/hapi__joi

2. 创建验证管道类

// JoiValidationPipe.ts

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import Joi = require('@hapi/joi');

@Injectable()
export class JoiValidationPipe implements PipeTransform {
  constructor(private readonly schema: Joi.Schema) {}

  // value 是传进来的值, 从metadata中可以取出 相关类型 Body Query 等
  transform(value: any, metadata: ArgumentMetadata) {
    const { error } = this.schema.validate(value);
    if (error) {
      throw new BadRequestException(error.message || 'Validation failed');
    }
    return value;
  }
}

3. 创建需要验证的对象schema, 当然如果是简单的验证某个字段, 也可以不需要定义, 后面会给出示例

// cat.schema.ts

// cat 验证器
import Joi = require('@hapi/joi');
export default Joi.object({
  name: Joi.string()
    .alphanum()
    .min(3)
    .max(30)
    .required(),

  age: Joi.number()
    .integer()
    .min(1900)
    .max(2013)
    .required(),

  color: Joi.string().required()
});

示例

1. 使用cat.schema.ts 来验证

// app.controller.ts

import { Controller, Get, Post, UsePipes, Body, PipeTransform, Query } from '@nestjs/common';
import Joi = require('@hapi/joi');

import { AppService } from './app.service';
import { JoiValidationPipe } from './valider/JoiValidationPipe';
import CatSchema from './schema/cat.schema';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  // 使用方式一
  @Post('cat')
  @UsePipes(new JoiValidationPipe(CatSchema)) // 此处会直接把body 或者 query 传到transform 里 也就是value
  cat(@Body() body) {}

  // 使用方式二 和 方式一 略有区别
  @Post('cat1')
  cat_1(@Body(new JoiValidationPipe(CatSchema)) body) {} // 此处会直接把 body 传到transform里 也就是value, @Query同理

  // 使用方式三  属性验证
  @Get('cat2')
  cat_2(
    @Query(
      'age',
      // 此处直接使用Joi对象来创建schema 详情可以取Joi官网查看
      new JoiValidationPipe(
        Joi.number()
          .positive() // 正数
          .integer() // 整数
          .max(100) // 最大100
          .required() // 必须
      )
    )
    age
  ) {} // 此处会直接把 query 传到transform里 也就是value,
}

传送门

nestjs中文网 pipe中joi的使用

hapi/Joi官网

总结

  至此一个简单的nestjs中使用Joi和pipe进行验证的demo就写好了, 是不是很简单呢 0..0

感谢您的阅读!如果文章中有任何错误,或者您有更好的理解和建议,欢迎和我联系!

发布了29 篇原创文章 · 获赞 18 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Baby_lucy/article/details/104994736