В следующем контроллере при вызове GET я намерен передать логический параметр.
@Controller('tests')
export class TestController {
constructor(private readonly testService: TestService) {}
@Get()
async getTests(@Query() params: QueryParamDto) {
return await this.testService.getTests(params.var);
}
}
а метод Service понимает тип 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
, она не может проанализировать переменную как логическое значение и ошибки.
{
"statusCode": 400,
"message": [
"var must be a boolean value"
],
"error": "Bad Request"
}
Насколько я понимаю, app.useGlobalPipes(new ValidationPipe({transform: true...})
должен автоматически анализировать тип params, определенный в Dto, в данном случае var
как boolean
в QueryParamDto
.
transform
означает, что результатом plainToClass
из class-transformer
будет результирующий параметр, переданный вашему обработчику маршрута. Обычно это нормально, но параметры запроса и URL всегда отображаются как string
, поэтому вам нужно либо добавить свои собственные @Transform()
, чтобы они правильно преобразовывались, либо использовать параметр transformOptions.enableImplicitConversion
.