@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 验证失败(需要数字字符串)的主要内容,如果未能解决你的问题,请参考以下文章