简体   繁体   中英

NestJs - Ignore Class validation in Class Validator

I have a DTO. I need to validate user entries against some strings. Those values are coming from ENV file. I got it to work, but I also need to ignore the case.

This is the value from the env file:

SEARCH_BY_LANGUAGE="Java,Javascript"

This is my version where it works, but it is sensitive to cases:

@Expose()
@IsNotEmpty()
@ApiProperty()
@IsIn(process.env.SEARCH_BY_LANGUAGE.toLowerCase().split(","))
targetLanguage: string

Problem with this approach is that, java and Java are treated differently.

I have tried to use the @Matches, like this:

@Expose()
@IsNotEmpty()
@ApiProperty()
@Matches(`^${process.env.SEARCH_BY_LANGUAGE.split(",")}$`, 'i')
targetLanguage: string

But I am getting this error:

[ExceptionsHandler] Invalid flags supplied to RegExp constructor '^Java,Javascript$' +14493m

I feel I am close, but cant figure it out.

You have two possible approaches for that, the first one is @Transform() decorator from class-transformer , like Jay McDoniel commented above:

You can perform additional data transformation using @Transform decorator. For example, you want to make your Date object to be a moment object when you are transforming object from plain to class:

 import { Transform } from 'class-transformer'; import * as moment from 'moment'; import { Moment } from 'moment'; export class Photo { id: number; @Type(() => Date) @Transform(({ value }) => moment(value), { toClassOnly: true }) date: Moment; }

Now when you call plainToClass and send a plain representation of the Photo > object, it will convert a date value in your photo object to moment date. @Transform decorator also supports groups and versioning.

So you would do something like this:

@Transform((value) => value.toLowerCase() })
 targetLanguage: string

Your second approach would be to use a NestJS custom interceptor and manually change your payload/data before using it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM