javascript - ValidationPipe() 不适用于覆盖 Nestjs/Crud 中的 @Query
问题描述
我正在尝试验证 get 请求查询中的参数,但由于某种原因,验证管道无法识别查询的元素。
import {
Controller,
Post,
Query,
Body,
UseInterceptors,
Param,
Res,
Logger,
} from '@nestjs/common';
import { Crud, CrudController, Override } from '@nestjsx/crud';
import { OpenScheduleDto } from './open-schedule.dto';
@Crud(Schedule)
export class ScheduleController
implements CrudController<ScheduleService, Schedule> {
constructor(public service: ScheduleService) {}
get base(): CrudController<ScheduleService, Schedule> {
return this;
}
@Override()
async getMany(@Query() query: OpenScheduleDto) {
return query;
}
}
OpenSchedule.dto
import { IsNumber, IsOptional, IsString } from 'class-validator';
export class OpenScheduleDto {
@IsNumber()
companyId: number;
@IsNumber()
@IsOptional()
professionalId: number;
@IsString()
@IsOptional()
scheduleDate: string;
}
当我向http://localhost:3000/schedules?companyId=3&professionalId=1发出获取请求时
我收到意外错误:
{
"statusCode": 400,
"error": "Bad Request",
"message": [
{
"target": {
"companyId": "3",
"professionalId": "1"
},
"value": "3",
"property": "companyId",
"children": [],
"constraints": {
"isNumber": "companyId must be a number"
}
},
{
"target": {
"companyId": "3",
"professionalId": "1"
},
"value": "1",
"property": "professionalId",
"children": [],
"constraints": {
"isNumber": "professionalId must be a number"
}
}
]
}
解决方案
那是因为当你使用@Query
参数时,一切都是字符串。它没有像 json 这样的数据类型的数字或布尔值。因此,您必须首先将您的值转换为数字。为此,您可以使用class-transformer
's @Transform
:
import { IsNumber, IsOptional, IsString } from 'class-validator';
import { Transform } from 'class-transformer';
export class OpenScheduleDto {
@Transform(id => parseInt(id))
@IsNumber()
companyId: number;
@Transform(id => id ? parseInt(id) : id)
@IsNumber()
@IsOptional()
professionalId?: number;
@IsString()
@IsOptional()
scheduleDate?: string;
}
但请注意,这是不安全的,因为例如parseInt('5abc010')
is 5
。因此,您可能希望在转换函数中进行额外检查。
推荐阅读
- xamarin - Xamarin Android Java 绑定:缺少类 (XMLReader)
- java - 批量执行不带参数的存储过程 Spring SimpleJdbcCall
- c++ - VS2017 中的 _crtBreakAlloc
- google-chrome-extension - 如何将 chrome 扩展连接到网络浏览器流量
- cumulocity - Cumulocity - 自定义小部件配置 - 多设备配置
- laravel - laravel_token 对第一个请求有效,但对后续请求无效
- javascript - 填充猫鼬模型的实例
- extendscript - 在 After Effects 扩展脚本中获取所有打开的合成
- symfony - 为一对一关联设置默认值
- json - 在 nodejs 请求中解析 JSON