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 中定义的参数类型,在本例中 varboolean in QueryParamDto.

transform 表示 plainToClass 来自 class-transformer 的结果将是传递给路由处理程序的结果参数。通常这会很好,但是查询和 url 参数总是以 string 的形式出现,因此您需要添加自己的 @Transform() 以使它们正确转换,或者使用 transformOptions.enableImplicitConversion选项