/** * @author songxiwen * @date 2020/08/17 15:41 */ import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common'; import { validate } from 'class-validator'; import { plainToClass } from 'class-transformer'; import { ServerError } from '../error/server.error'; @Injectable() export class ValidationPipe implements PipeTransform { async transform(value: T, { metatype }: ArgumentMetadata) { if (!metatype || !ValidationPipe.toValidate(metatype)) { return value; } const object = plainToClass(metatype, value); const errors = await validate(object); if (errors.length) { throw ServerError.code.ValidationFailed; } return value; } private static toValidate(metatype: Function): boolean { const types: Function[] = [String, Boolean, Number, Array, Object]; return !types.includes(metatype); } }