【问题标题】:How to transform input data with NestJS and TypeORM如何使用 NestJS 和 TypeORM 转换输入数据
【发布时间】:2019-11-08 08:07:05
【问题描述】:

我想创建可以在传入数据到达数据库之前对其进行转换的功能。假设我们要确保在创建新用户时,firstName 和 lastName 属性值始终以大写字母开头。或者另一个很好的例子是防止登录问题并始终以小写字母存储电子邮件地址。

我查看了 NestJS 的管道文档,但它太笼统了。我希望能够指定哪些字段需要转换,并且我不想为每个需要转换的属性或端点创建管道。

我还尝试了“class-transformer”包中的@Transform 装饰器,但这似乎不起作用。

export class UserRoleCreateDto {
  @IsDefined()
  @IsString()
  @IsNotEmpty()
  @Transform((name) => name.toUpperCase())
  readonly name;
}

预期的结果应该是大写字母的名称,但不是。

关于如何在 NestJS / TypeORM 进入数据库之前实现正确的输入转换的任何想法或示例?

感谢您的宝贵时间!

【问题讨论】:

    标签: typescript nestjs typeorm


    【解决方案1】:

    这是一个小的工作示例

      @UsePipes(new ValidationPipe({transform: true}))
      @Get('test_input')
      async testInput(@Query() data: UserRoleCreateDto): Promise<any> {
    
        return data;
      }
    

    并签入 bash:

    curl 'http://localhost:3060/test_input?name=hello'
    
    {"name":"HELLO"}
    

    检查您是否有ValidationPipe 装饰器,尤其是transform: true 选项,没有这些它就不起作用。 transform: true 自动将输入数据转换为类实例。

    在 Nestjs 文档页面上了解更多关于验证的信息 - link

    另外,为了以防万一,您可以使用 @Body() 来代替 @Query() 装饰器来处理 POST 数据或使用 @Param() 来处理 URL 参数

    【讨论】:

      【解决方案2】:

      你也可以使用 TypeORM 的实体监听器。

      @BeforeInsert

      您可以在实体中定义具有任何名称的方法并用@BeforeInsert 标记它,TypeORM 将在使用存储库/管理器保存插入实体之前调用它。

      @Entity()
      export class User {
          
          @BeforeInsert()
          nameToUpperCase() {
              this.email = this.email.toLowerCase()
              this.name = this.name.toUpperCase();
          }
      }
      

      来源here

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 2020-12-09
        • 2021-04-28
        • 2021-08-04
        • 2021-05-26
        • 2019-05-09
        • 2020-12-20
        • 2022-01-11
        • 2020-11-14
        相关资源
        最近更新 更多