如何在 Nestjs 上使用具有多个 dto 的一条路由?

Posted

技术标签:

【中文标题】如何在 Nestjs 上使用具有多个 dto 的一条路由?【英文标题】:How to using one route with multiple dto on Nestjs? 【发布时间】:2019-06-02 12:18:36 【问题描述】:

目前我正在使用 NestJS 来构建 restful api。 我遇到了ValidationPipe 问题。它仅适用于控制器方法,不适用于服务方法。

我需要为route 上的每个ROLE(管理员、员工、用户)选择不同的DTO 类(UserCreateDTOStaffCreateDTO、...)。

【问题讨论】:

能举个代码例子吗? 还有问题吗? 【参考方案1】:

管道仅适用于控制器,您不能将它们与服务一起使用。但是您可以在代码中的任何位置使用 class-validator 的 validate 方法(连同 class-transformer 的 plainToClass 方法):

const user = plainToClass(UserCreateDto, userRequestEntity);
const errors = await validate(user)
if (errors.length > 0) 
  throw this.createError(errors);


此外,您不需要为不同的角色创建多个 DTO 类。只需使用class-validatorgroups:

将 DTO 中的每个属性分配给一个或多个组(= 角色):

@Min(12, groups: ['admin', 'staff'])
age: number;
@Length(2, 20, groups: ['admin'])
name: string;

然后将您的组(角色)传递给plainToClassvalidate

// Pass your roles as groups
const groups = ['admin'];

// Transform to class with groups
const entityClass = plainToClass(EntityDto, entity,  groups )

// Validate with groups
const errors = await validate(entityClass,  groups );

【讨论】:

以上是关于如何在 Nestjs 上使用具有多个 dto 的一条路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dto 验证 nestjs 中的对象数组

如何在 NestJs 框架中使用 postgres 和 sequelize 正确定义 DTO 对象

我们如何在DTO中使用对象数组和nestjs中的multipart-formdata?

如何在 NestJS 中编写嵌套 DTO

如何在 Nestjs 中为 @Body 构建 DTO

禁止 Nestjs 中 DTO 的特定枚举值