【问题标题】:NestJs - Ignore Class validation in Class ValidatorNestJs - 忽略类验证器中的类验证
【发布时间】:2022-02-14 03:29:40
【问题描述】:

我有一个 DTO。我需要根据一些字符串验证用户条目。这些值来自 ENV 文件。我得到了它的工作,但我也需要忽略这个案例。

这是来自 env 文件的值:

SEARCH_BY_LANGUAGE="Java,Javascript"

这是我的版本,但它对大小写很敏感:

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

这种方法的问题在于,java 和 Java 的处理方式不同。

我尝试过使用@Matches,像这样:

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

但我收到此错误:

[ExceptionsHandler] 提供给 RegExp 构造函数的标志无效 '^Java,Javascript$' +14493m

我觉得我很接近,但无法弄清楚。

【问题讨论】:

  • 为什么不将传入的值强制为小写,以便使用@Transform()@IsIn() 装饰器进行检查?

标签: javascript node.js nestjs


【解决方案1】:

您有两种可能的方法,第一种是来自class-transformer@Transform() 装饰器,就像上面的 Jay McDoniel 评论的那样:

您可以使用@Transform 装饰器执行额外的数据转换。例如,当您将对象从普通对象转换为类对象时,您希望将 Date 对象设置为时刻对象:

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

现在,当您调用 plainToClass 并发送 Photo > 对象的普通表示时, 它会将您照片对象中的日期值转换为时刻日期。 @Transform 装饰器还支持组和版本控制。

所以你会做这样的事情:

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

您的第二种方法是使用NestJS custom interceptor 并在使用前手动更改您的有效负载/数据

【讨论】:

  • 自定义拦截器从未出现在我的脑海中。而且我经常使用它。很好的建议。
猜你喜欢
  • 2021-02-03
  • 2022-08-02
  • 2020-06-04
  • 1970-01-01
  • 2021-03-09
  • 2023-02-22
  • 2020-08-09
  • 2019-08-29
  • 2021-04-22
相关资源
最近更新 更多