NestJS Validation failed (numeric string is expected) inside @Get Controller and Boolean Query

Viewed 1539

So I got a User Enitity (Benutzer) and want to get only those users, who are supervisors (Vorgesetzter). Therefore I implemented a Service called " getAllVorgesetzten".

The User Entity looks like:

@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[];
}

The User Service is implemented as follows:

@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);
    });
  }
}

And the Controller looks like:

@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);

} }

So I have the request method like http://localhost:3000/benutzer/vorgesetzter?istVorgesetzter=true and want to get all users (benutzer) where istVorgesetzter = true. But I get the following error:

error in swagger

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

Order matters here, @Get('/vorgesetzter') should be implemented before @Get(':id'). With that request you are calling this.benutzerService.findBenutzerByID(id); with the following string: vorgesetzter?istVorgesetzter=true receiving the error you describe.

This is how express is implemented and NestJS follows the same behaviour: expressjs/express#2235, nestjs/nest#995

Related