几个错误而不是一个

问题描述

我正在使用 https://www.npmjs.com/package/nestjs-joihttps://www.npmjs.com/package/joi 来验证我的 nestJS 应用的请求。

我有一个用于创建用户的架构

@JoiSchemaOptions({
  allowUnkNown: false,})
export class UserDto {
  @JoiSchema(Joi.string().required())
  @JoiSchema([CREATE],Joi.string().required())
  @JoiSchema([UPDATE],Joi.string().optional())
  name: string;

  @JoiSchema(Joi.string().required())
  @JoiSchema([CREATE],Joi.string().optional())
  surname: string;

  @JoiSchema([CREATE],Joi.string().email({ minDomainSegments: 2 }).required())
  email: string;

  @JoiSchema([CREATE],Joi.string().min(6).required())
  password: string;
}

用户控制器:我像 netsjs-joi 说的那样使用它,将 UserDto 作为控制器中的参数,我想也许我需要一些错误处理程序并按照我想要的方式准备我的错误,但是有什么不可以的Joi中的盒子

import {
  Controller,Get,Param,BadRequestException,Post,Body,} from '@nestjs/common';

import { UserService } from './user.service';
import { UserDto } from './dto/user.dto';

@Controller('user')
export class UserController {
  constructor(private userService: UserService) {}

  @Post()
  create(@Body() createData: UserDto): string {
    console.log(JSON.stringify(createData,null,2));
    return 'something';
  }
}

当我用这个 body 发送请求时

{
    "name": "name","surname": "","email": "error","password": "error"
}

出现错误

{
    "statusCode": 400,"message": "Request validation of body Failed,because: \"surname\" is not allowed to be empty,\"email\" must be a valid email,\"password\" length must be at least 6 characters long","error": "Bad Request"
}

但我想得到例如这样的东西

[ {
"statusCode": 400,","error": "Bad Request","surname": "Surname is not allow to be empty",},{
    "statusCode": 400,because: \"email\" must be a valid email","email": "Email must be a valid email"
},...
]

有什么想法吗?谢谢!))

解决方法

试试这个

@JoiSchemaOptions({
  allowUnknown: false,abortEarly:false   //added this line here
})
export class UserDto {
  @JoiSchema(Joi.string().required())
  @JoiSchema([CREATE],Joi.string().required())
  @JoiSchema([UPDATE],Joi.string().optional())
  name: string;

  @JoiSchema(Joi.string().required())
  @JoiSchema([CREATE],Joi.string().optional())
  surname: string;

  @JoiSchema([CREATE],Joi.string().email({ minDomainSegments: 2 }).required())
  email: string;

  @JoiSchema([CREATE],Joi.string().min(6).required())
  password: string;
}
,

我删除了 nestjs-joi 并创建了通常的 Joi 架构

    import * as Joi from 'joi';
    
    export default Joi.object({
      name: Joi.string().required(),surname: Joi.string().required(),email: Joi.string().email({ minDomainSegments: 2 }).required(),password: Joi.string().min(6).required(),});

在这之后创建了 JoiValidationPipe

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

@Injectable()
export class JoiValidationPipe implements PipeTransform {
  constructor(private schema: ObjectSchema) {}

  transform(value: any,metadata: ArgumentMetadata) {
    const { error } = this.schema.validate(value,{
      abortEarly: false,allowUnknown: false,});
    if (error) {
      throw error;
    }
    return value;
  }
}

并在控制器中像这样使用它

@Controller('user')
export class UserController {
  constructor(private userService: UserService) {}

  @Post()
  @UsePipes(new JoiValidationPipe(UserCreateSchema))
  create(@Body() createData: CreateUser): string {
    return 'createData';
  }
}