首页 > 解决方案 > @Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)

问题描述

所以我得到了一个用户实体(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。但我收到以下错误:

大摇大摆的错误

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

标签: mysqlvue.jsnestjs

解决方案


这里的命令事项,@Get('/vorgesetzter')应先执行@Get(':id')。使用该请求,您this.benutzerService.findBenutzerByID(id);使用以下字符串调用:vorgesetzter?istVorgesetzter=true接收您描述的错误。

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


推荐阅读