我想创建一些功能,以便在传入的数据到达数据库之前对其进行转换。假设我们要确保在创建新用户时,firstName和lastName属性值始终以大写字母开头。另一个很好的例子是防止登录问题,并始终以小写字母存储用户的电子邮件地址。
我看过nestJS的管道文档,但这是通用的。我希望能够指定哪些字段需要转换,并且我不想为每个需要转换的属性或端点创建管道。
我也尝试过@transform装饰器形式的'class-transformer'包,但这似乎不起作用。
export class UserRoleCreateDto {
@IsDefined()
@IsString()
@IsNotEmpty()
@Transform((name) => name.toUpperCase())
readonly name;
}
预期结果应为大写字母的名称,但不是。
有任何想法或示例如何在NestJS / TypeORM进入数据库之前实现正确的输入转换?
感谢您的时间!
答案 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进行标记,TypeORM会在使用存储库/管理器保存插入实体之前调用它。
@Entity()
export class User {
@BeforeInsert()
nameToUpperCase() {
this.email = this.email.toLowerCase()
this.name = this.name.toUpperCase();
}
}
来源here