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

Jor*_*nve 6 typescript typeorm nestjs

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

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

我也尝试过 @Transform 装饰器形成“class-transformer”包,但这似乎不起作用。

export class UserRoleCreateDto {
  @IsDefined()
  @IsString()
  @IsNotEmpty()
  @Transform((name) => name.toUpperCase())
  readonly name;
}
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是大写字母的名称,但事实并非如此。

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

谢谢你的时间!

And*_*ikh 12

这是一个小的工作示例

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

    return data;
  }
Run Code Online (Sandbox Code Playgroud)

并检查 bash:

curl 'http://localhost:3060/test_input?name=hello'

{"name":"HELLO"}
Run Code Online (Sandbox Code Playgroud)

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

有关 nestjs 文档页面上的验证的更多信息 -链接

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


Has*_*rki 8

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

@插入之前

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

@Entity()
export class User {
    
    @BeforeInsert()
    nameToUpperCase() {
        this.email = this.email.toLowerCase()
        this.name = this.name.toUpperCase();
    }
}
Run Code Online (Sandbox Code Playgroud)

来源在这里


moh*_*ati 7

这就是您所需要的:

class ClassName {
  @Transform((param) => param.value.toUpperCase())
  name: string;
}
Run Code Online (Sandbox Code Playgroud)

请注意,转换中的解构对象不会关心属性名称。这些是你可以使用的东西paramvalue, key, obj, type

参考阅读更多