如何使用NestJS和TypeORM

时间:2019-06-26 11:28:40

标签: typescript nestjs typeorm

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

我看过nestJS的管道文档,但这是通用的。我希望能够指定哪些字段需要转换,并且我不想为每个需要转换的属性或端点创建管道。

我也尝试过@transform装饰器形式的'class-transformer'包,但这似乎不起作用。

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

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

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

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

这是一个小的工作示例

  @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

以防万一,代替@Query()装饰器,您可以将@Body()用于POST数据或将@Param()用于URL参数

答案 1 :(得分:0)

您还可以使用TypeORM的实体侦听器。

@BeforeInsert

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

@Entity()
export class User {

    @BeforeInsert()
    nameToUpperCase() {
        this.email = this.email.toLowerCase()
        this.name = this.name.toUpperCase();
    }
}

来源here