标签: class-validator

我们如何覆盖 NestJs 中的全局验证管道?

我有一个代码,其中我在文件中应用了全局验证管道,main.ts如下所示:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  // Enable global validation pipe
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true
  }));
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的一个控制器中,我想在补丁请求中跳过 DTO 的某些属性,如下所示

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  // Enable global validation pipe
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true
  }));
}
Run Code Online (Sandbox Code Playgroud)

这是我的 DTO:

    @Patch(':id')
    // Override the pipes
    @UsePipes(new ValidationPipe({
        skipMissingProperties: true,
    }))
    updateProject(@Param('id') accountId: string, @Body() dataToUpdate: UpdateProjectDTO) {
        return dataToUpdate;
    }
Run Code Online (Sandbox Code Playgroud)

projectDescription如果它没有作为请求的一部分提交,我想忽略它。但在这种情况下,我的全局管道优先,但它没有skipMissingProperties定义为其属性的一部分。有没有覆盖全局管道的解决方案?

typescript class-validator nestjs

6
推荐指数
1
解决办法
3711
查看次数

在 nestjs 中具有嵌套对象数组的类验证器

我正在尝试验证 nestjs 中的嵌套对象数组,它工作正常。但是,如果我发送非数组值(如字符串或空值),则会出现错误:

TypeError: Cannot read property 'length' of undefined.

嵌套字段:

@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];
Run Code Online (Sandbox Code Playgroud)

如何在验证嵌套对象之前验证该值是一个数组?

版本:

NestJS: 6.10.14
class-validator: 0.11.0
Run Code Online (Sandbox Code Playgroud)

dto typescript class-validator nestjs

6
推荐指数
1
解决办法
1591
查看次数

装饰器和私有字段 javascript

我发现自己尝试使用具有本机 javascript 私有属性 (#) 的装饰器,而这些正在使用的第一个“识别”不起作用。

我通过在值对象的私有属性上使用类验证器装饰器来识别这一点。

我在代码编辑器中收到的错误是:装饰器在这里无效

例子:

import { IsString } from 'class-validator';

Class Person {
  @IsString()
  #name: string;

  constructor(name: string) {
    this.#name = name;
  }

  get name(): string {
    return this.#name;
  }
}
Run Code Online (Sandbox Code Playgroud)

javascript private decorator typescript class-validator

6
推荐指数
1
解决办法
1445
查看次数

Nestjs ValidationPipe({transform: true}) 不会将请求正文的字符串转换为数字

正如文档中提到的

ValidationPipe 可以自动将有效负载转换为根据其 DTO 类键入的对象。要启用自动转换,请将转换设置为 true。

但我总是收到错误请求,因此转换不起作用。

邮递员请求体

验证DTO

export class CreateDistrictDto {
    @IsString()
    @IsNotEmpty()
    name: string;
    
    
    // associations
    @IsNotEmpty()
    @IsNumber()
    cityId: number;
}
Run Code Online (Sandbox Code Playgroud)

控制器中的路线

    @Post()
    async createCity(@Body() cityDto: CreateCityDto) {
        return await this.cityService.createCity(cityDto);
    }
Run Code Online (Sandbox Code Playgroud)

main.ts(我使用默认的@nestjs/common ValidationPipe)

app.useGlobalPipes(new ValidationPipe({
    transform: true,
}));
Run Code Online (Sandbox Code Playgroud)

这个答案说转换不适用于基元,这似乎是正确的。

/sf/answers/4702707831/ https://github.com/nestjs/nest/blob/master/packages/common/pipes/validation.pipe.ts#L137

那么为什么文档另有说法,transform: true 选项的用途是什么?

dto class-validator nestjs class-transformer

6
推荐指数
2
解决办法
8078
查看次数

是否可以验证单个路由参数?

假设我有以下路线:

companies/{companyId}/departments/{departmentId}/employees
Run Code Online (Sandbox Code Playgroud)

是否可以分别验证两个资源 id ( companyId, departmentId) ?我尝试过关注,但没有成功。

class ResourceId {
  @IsNumberString()
  @StringNumberRange(...) // my custom validator
  id: number;
}

@Get(':companyId/departments/:departmentId/employees')
getEmployees(
  @Param('companyId') companyId: ResourceId,
  @Param('departmentId') departmentId: ResourceId,
) {}
Run Code Online (Sandbox Code Playgroud)

当单个路由中有多个参数时,我遇到了多种情况。我不想为每条路线创建单独的验证类。有没有办法以不同的方式处理这个问题?

javascript node.js typescript class-validator nestjs

5
推荐指数
2
解决办法
6343
查看次数

使用 class-validator 验证类中的一个字段

假设我有一个基于文档中示例的类(https://github.com/typestack/class-validator#usage

import {MinLength, MaxLength, validate} from "class-validator";

export class Post {

    @IsString()
    body: strong;

    @IsString()
    title: string;

    //...many more fields

    public async validate(){
        validate(this, { forbidUnknownValues: true, validationError: { target: false } });
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建此类的一个实例并向字段分配值。

const post = new Post()
post.body = 'body'
post.title = 'title'
// ... assign all the other fields
Run Code Online (Sandbox Code Playgroud)

我想验证post,跳过除 之外的所有字段的验证title。除了将组分配给所有字段之外,似乎没有其他方法可以做到这一点,而我不想这样做。有没有办法只验证这个单一字段?

typescript class-validator

5
推荐指数
1
解决办法
4615
查看次数

使用 class-validator 验证数字 18.2

我需要number 18.2使用class-validator进行验证。在当前阶段,我知道如何仅验证小数位:

export class PaymentBasicData {
    /**
     * Transaction amount.
     */
    @Expose()
    @IsNotEmpty()
    @IsNumber({ maxDecimalPlaces: 2 })
    @Min(0.01)
    @Max(999999999999999999.99)
    public amount: number;
}
Run Code Online (Sandbox Code Playgroud)

我应该number用点前 18 个数字和点后 2 个数字来验证 a 。它应该是什么样子?

typescript class-validator

5
推荐指数
0
解决办法
7237
查看次数

javascript/打字稿 | 类验证器 | 自定义验证装饰器| 覆盖“validator”方法中的“validationOptions”

考虑自定义验证装饰器部分中提供的示例:

// Decorator definition


import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isLongerThan',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [property],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          const [relatedPropertyName] = args.constraints;
          const relatedValue = (args.object as any)[relatedPropertyName];
          return typeof value === 'string' && typeof relatedValue === 'string' && value.length > relatedValue.length; // you can return a Promise<boolean> here as well, if you …
Run Code Online (Sandbox Code Playgroud)

javascript node.js typescript class-validator

5
推荐指数
1
解决办法
3669
查看次数

是否可以使用类验证器验证 2 个参数之一是否存在?

将类验证器与 NestJS 一起使用,我想验证用户是否提供了一个或propertyA一个propertyB,但他们不需要同时提供两者。

目前,我正在做类似的事情:

export class TestDto {
  @ValidateIf(obj => !obj.propertyB)
  @IsString()
  @IsNotEmpty()
  propertyA

  @ValidateIf(obj => !obj.propertyA)
  @IsString()
  @IsNotEmpty()
  propertyB
}
Run Code Online (Sandbox Code Playgroud)

如果他们没有提供任何参数,则会出现多个错误,指出propertyApropertyB是必需的并且应该是字符串等。

如果他们不提供这两个属性,我只想要一个错误,例如:“您必须提供 propertyA 或 propertyB。”

这可以使用 NestJS/class-validator 来完成吗?

javascript validation typescript class-validator nestjs

5
推荐指数
1
解决办法
6952
查看次数

带有自定义错误消息的类验证器关系验证

所以我正在构建一个 API,用户在请求正文中向我们提供,type可以是valuetypeCNIC, EMAIL, MOBILE

现在基于type我必须验证该值,例如是否EMAIL有效或是否MOBILE有效等。

正如我们所看到的,该value字段依赖于type验证它的字段。

我需要一种方法来使用class-validator validationPipe.

typescript class-validator nestjs

5
推荐指数
1
解决办法
7797
查看次数