gpt4 book ai didi

nestjs - 禁止 Nestjs 中 DTO 的特定枚举值

转载 作者:行者123 更新时间:2023-12-02 05:59:02 27 4
gpt4 key购买 nike

我的“AppState”枚举具有以下可能的枚举值:

export enum AppState {
SUCCESS,
ERROR,
RUNNING
}

我有一个带有 appState 的 UpdateAppStateDTO,它应该接受除 RUNNING 之外的所有枚举值。

export class UpdateAppStateDTO {
@IsEnum(AppState)
@NotEquals(AppState.RUNNING) // Doesn't work properly
public appState: AppState;
}

对于路线,我有这个例子

  @Patch()
public setState(@Body() { appState }: UpdateAppStateDTO): void {
console.log(appState);
}

如果请求正文为空或无效的枚举值,例如 appState 的“foobar”,我会收到 400,这很好。

问题是,当我发送“RUNNING”时,我仍然收到 200,而不是 400。

如何防止这种行为?

最佳答案

我假设您正在发送字符串'RUNNING',并且您试图确保该字符串未被使用,对吗?根据您当前拥有的内容,您的枚举映射到这些值:

export enum AppState {
SUCCESS = 0,
ERROR = 1,
RUNNING = 2
}

因此,如果您发送字符串 'RUNNING',验证器会检查 RUNNING !== 2 实际上是 true 领先成功验证。 @IsEnum() 装饰器检查以枚举的有效键发送的值,因此发送 'RUNNING' 通过该检查,因此您不这样做那里出现某种错误。

解决此问题的最详细方法是使您的枚举成为字符串枚举,如下所示:

export enum AppState {
SUCCESS = 'SUCCESS',
ERROR = 'ERROR',
RUNNING = 'RUNNING'
}

这将使每个 AppState 值映射到其相应的字符串,尽管这确实导致必须键入大量声明并可能导致重复的代码。

管理此问题的另一种方法是将您的 @NotEquals() 枚举设置为枚举值提供的键,如下所示:

export class UpdateAppStateDTO {
@IsEnum(AppState)
@NotEquals(AppState[AppState.RUNNING])
public appState: AppState;
}

但请记住,使用这种方法,当您稍后查看 appState 时,它仍然是一个数值而不是字符串。

你可以玩一下 this stackblitz我这样做是为了查看一些正在运行的代码。

关于nestjs - 禁止 Nestjs 中 DTO 的特定枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60505649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com