在下面的控制器中,在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类型,在本例中,var
是QueryParamDto
中的boolean
。
params.var
0意味着class-transformer
中plainToClass
的结果将是传递给路由处理程序的结果参数。通常情况下,这是可以的,但查询和url参数总是以string
s的形式出现,因此您需要添加自己的@Transform()
以使其正确转换,或者使用transformOptions.enableImplicitConversion
选项
我刚刚遇到这个问题,我的解决方案如下:
@IsDefined()
@Transform(({ value }) => {
if (value === 'true') return true;
if (value === 'false') return false;
return value;
})
@IsBoolean()
var: boolean;