javascript - ValidationPipe() 不适用于 Nestjs/Crud 中的重写 @Query

标签 javascript node.js typescript nestjs class-validator

我正在尝试验证 get 请求查询中的参数,但出于某种原因,验证管道无法识别查询的元素。

import {
  Controller,
  Post,
  Query,
  Body,
  UseInterceptors,
  Param,
  Res,
  Logger,
} from '@nestjs/common';
import { Crud, CrudController, Override } from '@nestjsx/crud';

import { OpenScheduleDto } from './open-schedule.dto';
@Crud(Schedule)
export class ScheduleController
          implements CrudController<ScheduleService, Schedule> {
          constructor(public service: ScheduleService) {}

          get base(): CrudController<ScheduleService, Schedule> {
            return this;
          }

          @Override()
          async getMany(@Query() query: OpenScheduleDto) { 
             return query; 
         } 
    }

OpenSchedule.dto

import { IsNumber, IsOptional, IsString } from 'class-validator';
export class OpenScheduleDto {

  @IsNumber()
  companyId: number;

  @IsNumber()
  @IsOptional()
  professionalId: number;

  @IsString()
  @IsOptional()
  scheduleDate: string;
}

当我向 http://localhost:3000/schedules?companyId=3&professionalId=1 发出获取请求时

我收到意外错误:

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": [
        {
            "target": {
                "companyId": "3",
                "professionalId": "1"
            },
            "value": "3",
            "property": "companyId",
            "children": [],
            "constraints": {
                "isNumber": "companyId must be a number"
            }
        },
        {
            "target": {
                "companyId": "3",
                "professionalId": "1"
            },
            "value": "1",
            "property": "professionalId",
            "children": [],
            "constraints": {
                "isNumber": "professionalId must be a number"
            }
        }
    ]
}

最佳答案

那是因为当你使用@Query参数时,一切都是字符串。它没有数字或 bool 值作为数据类型,如 json。因此,您必须先将您的值(value)转换为数字。为此,您可以使用 class-transformer@Transform:

import { IsNumber, IsOptional, IsString } from 'class-validator';
import { Transform } from 'class-transformer';
export class OpenScheduleDto {

  @Transform(id => parseInt(id))
  @IsNumber()
  companyId: number;

  @Transform(id => id ? parseInt(id) : id)
  @IsNumber()
  @IsOptional()
  professionalId?: number;

  @IsString()
  @IsOptional()
  scheduleDate?: string;
}

但请注意,这是不安全的,因为例如parseInt('5abc010')5。因此,您可能希望在转换函数中进行额外检查。

关于javascript - ValidationPipe() 不适用于 Nestjs/Crud 中的重写 @Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55423823/

相关文章:

javascript - 更新 anchor 标记点击时的输入标记值

javascript - 如何在res之后保留动态更改的html。(任何内容)

javascript - (点击)功能不会在 chrome angular 6 中触发

javascript - 为什么声明类型 <any> 可以解决未知方法的错误? ( typescript )

javascript - 将 int 插入 String 数组

javascript - 如何编写脚本来像我的用户一样自动完成流程?

javascript - 尽管元素的 id 正确,但无法删除元素?

mysql - 使用expressjs验证器和mysql检查用户名和电子邮件是否已经存在

node.js - 新的 package.json `exports` 字段不适用于 TypeScript

javascript - 如何调用 rest api 并将结果提供给后续的 promise 调用