mongodb IsMongoID()类验证器NestJs出现问题

qni6mghb  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(144)

我尝试在DTO上使用类验证器来检查id是否有效。
这是我的控制器:

@Get(':id')
  async find(@Param('id') { id }: IdDto) {
    try {
      return await this.userService.findOne(id);
    } catch (error) {}
  }

和我的Dto:

import { IsString, IsNotEmpty, IsMongoId } from 'class-validator';
import { Type, Transform } from 'class-transformer';

export class IdDto {
  @IsMongoId()
  id: string;
}

问题是当我尝试搜索有效用户时,例如:本地主机:3000用户/63ecf079c305ac977da87bcb
我得到这个错误:

{
"statusCode": 400,
"message": [
"id must be a mongodb id"
],
"error": "Bad Request"
}

我不知道为什么因为这是个有效的蒙戈身份证。
你能帮帮我吗?
此外,我想在我的服务中添加一个验证:

async findOne(id: string): Promise<IUser | null> {
    const user = await this.userModel.findById(id).exec();
    if (user === null) {
      throw new NotFoundException('No user found for this id');
    }
    return user;
  }

我想检查用户是否存在,如果我们寻找一个用户(有一个有效的id),但没有用户,我想抛出一个异常,并在我的控制器中捕获它。我怎么才能正确地做到这一点?谢谢大家:)

vatpfxk5

vatpfxk51#

好吧,让我给你一个简短而明确的答案:

首先,更新您的控制器以使用带有白名单的验证管道:truevalidation pipe选项。它应该可以修复以下问题:

@Get(':id')
  async find(@Param(new ValidationPipe({ whitelist: true })) { id }: IdDto) {
    try {
      return await this.answerService.findOne(id);
    } catch (error) {}
  }

注意:这将自动删除非白名单属性(那些在验证类中没有任何装饰器的属性),请参阅:https://docs.nestjs.com/techniques/validation#stripping-properties

其次,此article有助于您决定在找不到用户时如何处理异常。

相关问题