Nestjs 全局验证管道无法解析布尔查询参数
Nestjs Global Validation Pipe unable to Parse Boolean Query Param
在下面的控制器中,我打算在 GET 调用中传递一个布尔参数。
@Controller('tests')
export class TestController {
constructor(private readonly testService: TestService) {}
@Get()
async getTests(@Query() params: QueryParamDto) {
return await this.testService.getTests(params.var);
}
}
并且服务方法将 params.var
的类型理解为 boolean
。
@Injectable()
export class TestService {
@Get()
async getTests(var: boolean) {
return ...;
}
}
QueryParamDto
的样子。
export class QueryParamDto {
@IsDefined()
@IsBoolean()
var: boolean;
}
我在 main.ts
中定义了一个全局验证管道。
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
transform: true,
}),
);
await app.listen(3000);
}
bootstrap();
但是,当我调用端点 /tests?var=true
时,它无法将 var 解析为布尔值和错误。
{
"statusCode": 400,
"message": [
"var must be a boolean value"
],
"error": "Bad Request"
}
我的理解是 app.useGlobalPipes(new ValidationPipe({transform: true...})
应该自动解析 Dto 中定义的参数类型,在本例中 var
为 boolean
in QueryParamDto
.
transform
表示 plainToClass
来自 class-transformer
的结果将是传递给路由处理程序的结果参数。通常这会很好,但是查询和 url 参数总是以 string
的形式出现,因此您需要添加自己的 @Transform()
以使它们正确转换,或者使用 transformOptions.enableImplicitConversion
选项
在下面的控制器中,我打算在 GET 调用中传递一个布尔参数。
@Controller('tests')
export class TestController {
constructor(private readonly testService: TestService) {}
@Get()
async getTests(@Query() params: QueryParamDto) {
return await this.testService.getTests(params.var);
}
}
并且服务方法将 params.var
的类型理解为 boolean
。
@Injectable()
export class TestService {
@Get()
async getTests(var: boolean) {
return ...;
}
}
QueryParamDto
的样子。
export class QueryParamDto {
@IsDefined()
@IsBoolean()
var: boolean;
}
我在 main.ts
中定义了一个全局验证管道。
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
transform: true,
}),
);
await app.listen(3000);
}
bootstrap();
但是,当我调用端点 /tests?var=true
时,它无法将 var 解析为布尔值和错误。
{
"statusCode": 400,
"message": [
"var must be a boolean value"
],
"error": "Bad Request"
}
我的理解是 app.useGlobalPipes(new ValidationPipe({transform: true...})
应该自动解析 Dto 中定义的参数类型,在本例中 var
为 boolean
in QueryParamDto
.
transform
表示 plainToClass
来自 class-transformer
的结果将是传递给路由处理程序的结果参数。通常这会很好,但是查询和 url 参数总是以 string
的形式出现,因此您需要添加自己的 @Transform()
以使它们正确转换,或者使用 transformOptions.enableImplicitConversion
选项