【问题标题】:Several errors instead one几个错误而不是一个
【发布时间】:2021-08-27 06:33:39
【问题描述】:

我正在使用 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().required())
  @JoiSchema([UPDATE], 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';
  }
}

当我用这个正文发送请求时

{
    "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,
    "message": "Request validation of body failed, because: \"surname\" is not allowed to be empty,",
    "error": "Bad Request",
"surname": "Surname is not allow to be empty",
},
{
    "statusCode": 400,
    "message": "Request validation of body failed, because: \"email\" must be a valid email",
    "error": "Bad Request",
"email": "Email must be a valid email"
},
...
]

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

【问题讨论】:

    标签: javascript node.js typescript nestjs joi


    【解决方案1】:

    试试这个

    @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().required())
      @JoiSchema([UPDATE], Joi.string().optional())
      surname: string;
    
      @JoiSchema([CREATE], Joi.string().email({ minDomainSegments: 2 }).required())
      email: string;
    
      @JoiSchema([CREATE], Joi.string().min(6).required())
      password: string;
    }
    

    【讨论】:

    • 感谢您的回答,但我认为它的默认值没有任何变化
    • 好的。我能得到调用验证函数的代码吗
    • 对不起。我帮不了你。我认为设置abortEarly : false 可能会解决您的问题。
    【解决方案2】:

    我删除了 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';
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多