为啥白名单不会出现错误模型 NestJs 的错误

Posted

技术标签:

【中文标题】为啥白名单不会出现错误模型 NestJs 的错误【英文标题】:Why does whitelist dont get error with wrong model NestJs为什么白名单不会出现错误模型 NestJs 的错误 【发布时间】:2019-08-20 04:50:49 【问题描述】:

我想在路线的正文验证中使用白名单。我希望只接受与我的模型确认的数据,如果发送的某些参数不是我的模型 DTO 的一部分,则必须抛出错误。

这是我的 DTO:

export class RegisterDTO 
    @MinLength(5)
    userName: string;

    @MinLength(8)
    password: string;

    @IsNotEmpty()
    seller: boolean;

    address: 
        city: string;
        street: string;
        apartment?: string;
    ;

这是我的控制器:

@Post('register')
@UsePipes(new ValidationPipe( transform: true, whitelist: true))
async register(@Body() userDTO: RegisterDTO) 
    const user = await this.userService.create(userDTO);
    const payload: Payload = 
        userName: user.userName,
        seller: user.seller,
    ;

    const token = await this.authService.signPayload(payload);
    return user, token;

但是当我发送此数据时,我没有收到错误:


   "userName": "userdasdnasdasdadad",
   "password": "passwdasdasdasadasdasda",
   "address": 
      "city": "kiev",
      "street": "amosova"
   ,
   "seller": false,
   "test": "test"

“test”:“test”不能作为参数;我预计会抛出一个错误,但没有

【问题讨论】:

【参考方案1】:

whitelist 选项仅在 json 转换为您的 dto 类时去除未知值而不抛出错误,因此在您的情况下,属性test 被静默删除。

如果要在遇到未知属性时抛出验证错误,需要添加选项forbidNonWhitelisted

@UsePipes(
    new ValidationPipe(
      transform: true,
      whitelist: true,
      forbidNonWhitelisted: true,
    ),
  )

【讨论】:

感谢您的回答。我添加了 forbidNonWhitelisted: true;它从响应中删除测试,但不会抛出错误snag.gy/ideuRb.jpg 一切正常并给我令牌,但我发送了错误的模型并想得到一个错误 嗯,这很奇怪。我在这里试过了,它可以工作:codesandbox.io/s/… 当您使用 "username": "kiwi", "firstname": "123456" 向 9jlkpxv744.sse.codesandbox.io 发送 POST 请求时,您将通过 "whitelistValidation": "property firstname should not exist" 获得 400 是的,这是真的!如果您想使用嵌套验证(例如您的地址),请参阅此答案:***.com/a/53685045/4694994

以上是关于为啥白名单不会出现错误模型 NestJs 的错误的主要内容,如果未能解决你的问题,请参考以下文章

Oauth 错误 invalid_request:redirect_uri 未列入白名单

使用 Cordova 5 在 iOS 上的错误白名单拒绝

phonegap 应用错误白名单拒绝:url='http://xyz.com'

在修改阿里云的白名单设置时,ApsaraDB for RDS(MySQL)的令牌错误

两种方法设置nginx并发限制下面的白名单策略

什么是白名单和黑名单数据?