如何使用 NestJS 和 TypeORM 转换输入数据

Posted

技术标签:

【中文标题】如何使用 NestJS 和 TypeORM 转换输入数据【英文标题】:How to transform input data with NestJS and 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 进入数据库之前实现正确的输入转换的任何想法或示例?

感谢您的宝贵时间!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何使用 NestJS 和 TypeORM 转换输入数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJs 中捕获 Typeorm 事务错误

如何从控制器 JSON 返回的实体字段中排除。 NestJS + Typeorm

如何在带有typeorm的nestjs项目中使用外部实体?

如何使用 typeORM 在 Nestjs 中创建类型为 Date 的列并键入 DateTime?

如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?

使用 TypeORM 和 Nestjs 进行测试的过程,以及使用 mocks 的玩笑?