@Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)

Posted

技术标签:

【中文标题】@Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)【英文标题】:NestJS Validation failed (numeric string is expected) inside @Get Controller and Boolean Query 【发布时间】:2021-03-08 19:11:17 【问题描述】:

所以我得到了一个用户实体 (Benutzer),并且只想得到那些用户,他们是主管 (Vorgesetzter)。因此我实现了一个名为“getAllVorgesetzten”的服务。

用户实体看起来像:

@Entity()
export class Benutzer 
@PrimaryGeneratedColumn( type: "int" )
BenutzerID: number;

@Column( type: "varchar", length: 50)
Benutzername: string;

@Column( type: "varchar", length: 50)
Passwort: string;

@Column()
istAdmin: boolean;

@Column()
istVorgesetzter: boolean;

@Column( type: "varchar", length: 50)
Vorgesetzter: string;

@Column( type: "varchar", length: 50)
Vorname: string;

@Column( type: "varchar", length: 50)
Nachname: string;

@Column()
Geburtsdatum: Date;

@Column( type: "varchar", length: 50)
Email: string;

@Column()
Eintrittsdatum: Date;

@ManyToOne(() => Arbeitstage, arbeitstage => arbeitstage.allebenutzer)
arbeitstage: Arbeitstage;

@ManyToOne(() => Bundesland, bundesland => bundesland.alleBenutzer)
bundesland: Bundesland;

@OneToMany(() => Urlaubsantrag, urlaubsantrag => urlaubsantrag.benutzer)
anträge: Urlaubsantrag[];

用户服务实现如下:

@Injectable()
export class BenutzerService 
constructor(
    @InjectRepository(Benutzer)
    private benutzerRepository: Repository<Benutzer>,
  ) 

  getAllBenutzer(): Promise<Benutzer[]> 
    return this.benutzerRepository.find( relations: ['bundesland', 'arbeitstage', 'anträge']);
  

  findBenutzerByID(id: number): Promise<Benutzer> 
    return this.benutzerRepository.findOne(id,  relations: ['bundesland','arbeitstage','anträge']);
  

  getAllVorgesetzten(istVorgesetzter: boolean): Promise<Benutzer[]>
    return this.benutzerRepository.find( where: istVorgesetzter: istVorgesetzter );
  

  async createBenutzer(benutzer: CreateBenutzer) 
    const nutzer = this.benutzerRepository.create(benutzer);
    await this.benutzerRepository.save(benutzer);
    return nutzer;
  

  async updateBenutzer(benutzer: UpdateBenutzer): Promise<UpdateResult> 
    return await this.benutzerRepository.update(benutzer.BenutzerID, benutzer);
  

  async deleteBenutzer(id: number): Promise<DeleteResult> 
    return await this.benutzerRepository.findOne(id).then((value) => 
      return this.benutzerRepository.delete(value);
    );
  

控制器看起来像:

@Controller('benutzer')
export class BenutzerController 
constructor(private readonly benutzerService: BenutzerService) 

@Post()
async createBenutzer(@Body() createBenutzer: CreateBenutzer): Promise<Benutzer> 
return this.benutzerService.createBenutzer(createBenutzer);


@Get()
async getBenutzer(): Promise<Benutzer[]> 
    return this.benutzerService.getAllBenutzer();


@Get(':id')
async getBenutzerByID(@Param('id', new ParseIntPipe()) id): Promise<Benutzer> 
    return this.benutzerService.findBenutzerByID(id);


@Get('/vorgesetzter')
async getAllVorgesetzten(@Query('istVorgesetzter', new ParseBoolPipe()) istVorgesetzter: boolean): Promise<Benutzer[]>
  console.log(istVorgesetzter);
  return this.benutzerService.getAllVorgesetzten(istVorgesetzter);


@Patch()
async update(@Body() updateBenutzer: UpdateBenutzer) 
return this.benutzerService.updateBenutzer(updateBenutzer);

@Delete(':id')
async remove(@Param('id', new ParseIntPipe()) id) 
return this.benutzerService.deleteBenutzer(id);

所以我有类似 http://localhost:3000/benutzer/vorgesetzter?istVorgesetzter=true 的请求方法,并且想要获取所有用户(benutzer),其中 istVorgesetzter = true。但我收到以下错误:

error in swagger

   
   "statusCode": 400,
   "message": "Validation failed (numeric string is expected)",
   "error": "Bad Request"
   

【问题讨论】:

【参考方案1】:

这里的顺序很重要,@Get('/vorgesetzter') 应该在@Get(':id') 之前执行。通过该请求,您使用以下字符串调用 this.benutzerService.findBenutzerByID(id);vorgesetzter?istVorgesetzter=true 收到您描述的错误。

这就是 express 的实现方式,NestJS 遵循相同的行为:expressjs/express#2235, nestjs/nest#995

【讨论】:

以上是关于@Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 从 Guard 访问用户

nestjs 中的可选身份验证

NestJS“获得”多个参数

如果不单独使用,nestjs/swagger 是不是支持查询参数的文档?

NestJS:如何在@Query 对象中转换数组

如何在 NestJS 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?