Nestjs全局验证管道无法分析布尔查询参数



在下面的控制器中,在GET调用中,我打算传递一个布尔参数。

@Controller('tests')
export class TestController {
constructor(private readonly testService: TestService) {}
@Get()
async getTests(@Query() params: QueryParamDto) {
return await this.testService.getTests(params.var);
}
}

并且服务方法将CCD_ 1的类型理解为CCD_。

@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中定义的params类型,在本例中,varQueryParamDto中的boolean

params.var0意味着class-transformerplainToClass的结果将是传递给路由处理程序的结果参数。通常情况下,这是可以的,但查询和url参数总是以strings的形式出现,因此您需要添加自己的@Transform()以使其正确转换,或者使用transformOptions.enableImplicitConversion选项

我刚刚遇到这个问题,我的解决方案如下:

@IsDefined()
@Transform(({ value }) => {
if (value === 'true') return true;
if (value === 'false') return false;
return value;
})
@IsBoolean()
var: boolean;

最新更新