【问题标题】:Cannot get ValidatorPipe to work with nest.js无法让 ValidatorPipe 与 nest.js 一起使用
【发布时间】:2019-05-10 18:59:53
【问题描述】:

当前行为

当我尝试为请求正文初始化验证管道时,如果给出无效类型,则不会发生任何事情。

预期行为

当用户指定的值与我的 DTO 中的类型不符时,我会因错误而拒绝。在这种情况下,我请求 /test 的正文为

{ "string": true }

我希望这会出错,但事实并非如此。

问题的最小再现

Test DTO

import { IsString } from "class-validator";
export class TestDTO {
  @IsString() public readonly string: string;
}

Test Controller

@Controller()
export class TestController {
  @Post("/test")
  public testing(@Body(new ValidationPipe()) test: TestDTO): string {
    return test.string;
  }
}

【问题讨论】:

  • 你的代码对我有用,在{"string": true} 上抛出 404。 return test.string 在你的情况下实际上返回一个布尔值吗?否则,请尝试重新安装您的 node_modules 并使用 npm update 更新您的依赖项。
  • 是的 @KimKern 它返回一个布尔值。我会尝试重新安装节点模块。如果这与它有关,我正在使用 fastify 适配器。而且,为什么它会抛出 404?不应该抛出 400 (BAD_REQUEST) 吗?
  • 是的,它是 400。对不起 ;)
  • 是的。重新安装节点模块,结果相同。请问:你用的是express还是fastify适配器?
  • 我用 express 试过了

标签: javascript node.js typescript nestjs class-validator


【解决方案1】:

当body包含布尔值时,后端(nestjs)将其解析为字符串 有一个装饰器来验证参数是否具有布尔值作为字符串

@IsBooleanString()
myVariable:boolean;

在你的情况下你可以做什么:

  • 选项 1

您可以将身体值从布尔值转换为数字

From { "string": true } To { "string": 1 }
  • 选项 2

您可以使用额外的validate decorator@IsNotIn(values: any[]) 示例:

@IsString()
@IsNotIn(["FALSE", "TRUE"])
myVariable: string;
  • 选项 3

您可以创建您的own decorator

import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsNotBoolean(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'IsNotBoolean',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
         if(value.toUpperCase() == 'TRUE' || value.toUpperCase() == 'FALSE'){
          return false
         } else {
          return true
         }
        },
      },
    });
  };
}

在 DTO 上

import { IsString } from "class-validator";
import { IsNotBoolean } from "the path of your custom validate decorator"

export class TestDTO {
  @IsString({myErrorKey:'My error message'}) 
  @IsNotBoolean({the optional error message object})
  string: string;
}

在控制器上

public testing(@Body(ValidationPipe) test: TestDTO): string {
    return test.string;
}

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2018-01-02
    • 2016-11-14
    • 2015-02-01
    • 2017-11-20
    • 2011-05-24
    • 2019-05-17
    • 2018-06-02
    • 2019-04-30
    相关资源
    最近更新 更多