Nodejs,一个未知的值被传递到validate函数,但是我找不到错误的地方

yvfmudvl  于 2023-01-16  发布在  Node.js
关注(0)|答案(3)|浏览(262)

谢谢你停下来的帮助。我有API工作在使用NodeJs,它有3个参数它接受,但它似乎有一个问题的验证。当我调用API,它给我这个结果,

[{
  "statusCode": 400,
  "message": [
    "an unknown value was passed to the validate function"
  ],
  "error": "Bad Request"
}]

帮帮我,谁都知道这是怎么回事!
我提出了三个论点,按顺序排列,

  • https://www.youtube.com/watch?v=C5Y3fpHg45U
  • 1
  • JP

我的密码也没了
x一个一个一个一个x一个一个二个一个x一个一个三个一个

k2fxgqgv

k2fxgqgv1#

main.ts/bootstrap/useGlobalPipes中将forbidUnknownValues标志设置为false

app.useGlobalPipes(
    new ValidationPipe({
      forbidUnknownValues: false
    }),
  );
hc2pp10m

hc2pp10m2#

对于任何寻找适当解决方案和解释而不仅仅是绕过错误的解决方案的人...
注册全局ValidationPipe时会发生此错误:

/* main.ts */
app.useGlobalPipes(new ValidationPipe())

或本地(端点级别):

@Post()
@UsePipes(new ValidationPipe({ transform: true }))
async save(@Query() dto: SomeDto) { ... }

在这种情况下,NestJS验证请求参数,如果它不匹配指定的类型,你会得到错误说:
向验证函数传递了未知值。
在大多数情况下,您的请求包含端点签名中不期望/未定义的一些附加数据,或者您只是缺少有关DTO或类的正确类型信息,这些DTO或类应作为输入类型。
例如,如果你在控制器中有一个函数,定义如下:

@Get('/list')
async getList(@Query() dto: MyDto): Promise<List> {
  return this.listService.getList(dto);
}

// ...

class MyDto {
  @IsString()
  name: string,
  @IsString()
  surname: string
}

然后传入{name: 'A', surname: 'B', age: 42},则会得到一个错误,因为不希望传入age
有时候查找这些错误可能会很耗时,一个简单的技巧可以帮助您解决这个问题,那就是实现您的自定义exceptionFactory并将其传递给ValidationPipe,您可以在ValidationPipe中打印出包含一些附加元数据的错误:

/* main.ts */
app.useGlobalPipes(new ValidationPipe({exceptionFactory: (e) => {
    console.error(e);
    throw new BadRequestException('You shall not pass!');
  }
}))

这不会解决你的问题,但至少会给予你一个信息,类型是不正确的,你可以从那里开始。

推荐解决方案

如果你确信你传递了正确的有效载荷,但是不想像其他建议那样设置forbidUnknownValues,那么很可能你的一个或多个类/DTO缺少一些类型声明,这些声明是成功验证有效载荷所必需的。对我来说,大多数时候我缺少嵌套(非原语)属性或对象数组的正确类型定义。

// Primitive type
@IsString()
name: string;

// Nested objects
@Type(() => Coach)
coach: Coach;

// Validate array of objects/entities
@ValidateNested({ each: true })
@Type(() => Player)
players: Player[];

您可以在文档中阅读更多关于Validation chapter中请求验证的信息。

34gzjxbg

34gzjxbg3#

您必须将 * 白名单 * 与 * 禁止非白名单 * 结合使用,
参考文献:
我们可以将可接受的属性列入白名单,任何未包括在白名单中的属性都将自动从生成的对象中删除
或者,您可以在存在非白名单属性时停止处理请求,并向用户返回错误响应。要启用此功能,请将forbidNonWhitelisted选项属性设置为true,同时将白名单设置为true
这对我很有效:

<ValidationOptions> {
  forbidNonWhitelisted: true,
  whitelist: true,
}

NestJS在这里有一个关于这个的部分。

相关问题