项目配置

简介: 项目配置

validation.pipe.ts

新建 validation.pipe.ts 文件,写入如下内容:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate, ValidationError } from 'class-validator';
import { plainToClass } from 'class-transformer';
@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  /**
   * 校验和转换实现,class-validator 和 class-transformer
   * @description 顺序为:先转换,后校验
   * @param value 原始值
   * @param param1 参数元数据
   * @returns 校验和转换后的类
   */
  async transform(value: any, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) return value;
    const object = plainToClass(metatype, value);
    const errors = await validate(object);
    if (errors.length > 0) throw new BadRequestException(this.getError(errors[0]));
    return object;
  }
  /**
   * 判断DTO数据是否需要校验和转换
   * @param metatype 数据类型
   * @returns 是否验证和转换
   */
  private toValidate(metatype: Function): boolean {
    const types: Function[] = [String, Boolean, Number, Array, Object];
    return !types.find(type => metatype === type);
  }
  /**
   * 获取 class-validator 验证错误显示信息
   * @param error class-validator验证错误
   * @returns 错误信息
   */
  private getError(error: ValidationError): string {
    if (error.constraints) return this.getConstraintsErrorMessage(error.constraints);
    if (error.children?.length) return this.getError(error.children[0]);
    return 'Validation failed';
  }
  /**
   * 获取 class-validator 错误约束信息可显示内容
   * @param constraints class-validator 错误约束信息
   * @returns 错误约束信息可显示内容
   */
  private getConstraintsErrorMessage(constraints: ValidationError['constraints']): string {
    for (const key in constraints) {
      if (constraints.hasOwnProperty(key) && constraints[key]) {
        return constraints[key];
      }
    }
  }
}点击复制复制失败已复制


main.ts

main.ts 文件中配置全局管道。

app.useGlobalPipes(new ValidationPipe());点击复制复制失败已复制


小提示

@nestjs/common 包中也有一个同名的 ValidationPipe 类暴露出来,我们要注意引入的时候别引用错了,要引用自己写的那个。


注意

混合应用useGlobalPipes() 方法不会为网关微服务设置管道, 对于标准(非混合)微服务应用使用 useGlobalPipes() 全局设置管道。

目录
相关文章
|
消息中间件 NoSQL 中间件
项目描述
项目怎么写? 1、靠技术取胜 2、项目描述
124 0
|
存储 JSON C++
VS配置新项目
VS配置新项目
|
Ubuntu 编译器 开发工具
ShiftMediaProject项目介绍
ShiftMediaProject项目介绍
190 0
|
存储 JSON 监控
1、工程搭建与配置
MongoDB是介于关系型和非关系型数据库之间的产品,nosql中最热门的数据库,存储数据是类似于JSON的bson格式的数据,可以存储复杂的数据类型,最大特点是它支持的查询语句非常强大
127 0
|
缓存 前端开发 大数据
第一次项目总结
第一次项目总结
|
XML 运维 Java
项目里的各种配置,你都了解吗?
项目里的各种配置,你都了解吗?
180 0
|
Java 应用服务中间件 C++
Java项目属性的配置解决方案
Java项目属性的配置解决方案
142 0
Java项目属性的配置解决方案
|
敏捷开发 程序员