【问题标题】:NestJS ValidationPipe is not working properly for @Query()NestJS ValidationPipe 对于@Query() 无法正常工作
【发布时间】:2022-11-17 03:31:48
【问题描述】:

我正在尝试使用内置的 NestJS ValidationPipe 将一些查询参数从字符串转换为 int,但它似乎无法正常工作,

这是我的控制器:

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;
}

主.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() 作为解决方案,我更希望管道使用 enableImplicitConversion: true 进行更改

我可以得到一些帮助吗?

谢谢

【问题讨论】:

    标签: javascript node.js nestjs dto


    【解决方案1】:

    查询 (@Query()) 和 URL (@Param()) 参数始终以字符串形式出现。要强制它们解析为数字,您可以添加 @Type(() => Number),以便 class-transformer 将它们转换为数字,然后 class-validator 读取正确的值

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2021-02-23
      • 2023-01-19
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      相关资源
      最近更新 更多