Я использую Nest. Js с TypeORM и хочу иметь sh мой пароль перед сохранением в БД.
Я пытался использовать декоратор событий @ 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;
}
Есть ли лучший подход для этого? Потому что в настоящее время я должен написать код в каждом методе, чтобы отобразить его.