我正在尝试使用内置的NestJS ValidationPipe将一些查询参数从字符串转换为整数,但似乎它并没有正常工作。
这是我的控制器:
import {
..., ValidationPipe
} from '@nestjs/common';
...
@UseGuards(JwtAuthGuard)
@Get()
findAll(@Req() req, @Query(new ValidationPipe({
transform: true,
transformOptions: { enableImplicitConversion: true },
forbidNonWhitelisted: true,
})) query: GetTestDto) {
return this.testService.findAll(query, req.user.id);
}
这是我的数据传输对象(DTO):
import { IsInt, IsOptional, IsString } from 'class-validator';
import { Transform } from 'class-transformer';
export class GetTestDto {
@IsOptional()
@IsString()
public search: string;
@IsOptional()
@Transform(({value}) => {
console.log(typeof value); // => string / I'm just testing here
return value
})
@IsInt()
public page: number;
@IsOptional()
@IsInt()
public limit: number;
}
main.ts:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import cookieParser from 'cookie-parser';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api');
app.use(cookieParser());
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
当我尝试调用
GET http://127.0.0.1:3000/api/test?page=1&limit=10
时,我会得到这个结果。validation error from the DTO I think:
{
"statusCode": 400,
"message": [
"page must be an integer number",
"limit must be an integer number"
],
"error": "Bad Request"
}
我已经尝试删除node_modules和dist文件夹,但是没有什么改变。
我不想在数据传输对象(DTO)中使用@Transform()作为解决方案,我更希望管道(pipeline)通过 enableImplicitConversion: true
来完成转换。
能否请您给我提供一些帮助?
谢谢!