【发布时间】:2020-05-23 22:26:42
【问题描述】:
我正在使用带有 TypeORM 的 Nest.Js,并且我想在保存到数据库之前对我的密码进行哈希处理。
我尝试使用事件装饰器 @BeforeInsert(),但它对我不起作用,但后来我发现它不起作用,因为我将 DTO 作为输入。
user.controller.ts
@Post()
async create(@Body() data: CreateUserDto, @Res() res) {
// if user already exist
const isUserExist = await this.service.findByEmail(data.email);
if (isUserExist) {
throw new BadRequestException('Email already exist');
}
// insert user
this.service.create(data);
// send response
return res.status(201).json({
statusCode: 201,
message: 'User added Successfully',
});
}
user.service.ts
create(data: CreateUserDto) {
return this.userRepository.save(data)
}
所以,我基本上是使用 DTO 来保存数据。这就是它不起作用的原因。
但我想做的是将 DTO 映射到用户对象。所以,这就是我所做的。
@Post()
async create(@Body() data: CreateUserDto, @Res() res) {
// Create User object
const user = new User();
// Map DTO to User object
for (const [key, value] of Object.entries(data)) {
user[key] = value;
}
// if user already exist
const isUserExist = await this.service.findByEmail(user.email);
if (isUserExist) {
throw new BadRequestException('Email already exist');
}
// insert user
this.service.create(user);
// send response
return res.status(201).json({
statusCode: 201,
message: 'User added Successfully',
});
}
create-user.dto.ts
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
export class CreateUserDto {
@IsNotEmpty()
@IsString()
@ApiProperty()
readonly firstName: string;
@IsNotEmpty()
@IsString()
@ApiProperty()
readonly lastName: string;
@IsNotEmpty()
@IsString()
@IsEmail()
@ApiProperty()
readonly email: string;
@IsNotEmpty()
@IsString()
@ApiProperty()
readonly password: string;
}
有没有更好的方法呢?因为目前我必须在每个方法中编写代码来映射它。
【问题讨论】:
标签: node.js typescript nestjs dto typeorm