Nest.js。在服务中使用之前转换(序列化)客户端数据的位置
Nest.js. Where transform (serialize) client's data before it will be use at service
我应该在哪里转换来自客户端的收入数据以使用 service.ts 文件中的转换值。
例如,我从客户端获取 JSON-data,如下所示
{
phone: 8-999-999-99-99
}
我有一个 register-client.dto
文件:
import { IsNotEmpty } from 'class-validator';
export class RegisterClientDTO {
@IsNotEmpty()
readonly phone: string;
}
我有一个 client.controller.ts
文件:
// imports here...
@Controller('clients')
export class ClientController {
constructor(private readonly clientService: ClientService) {}
@Post()
@UsePipes(new ValidationPipe())
create(@Body() registerClientDTO: RegisterClientDTO) {
return this.clientService.create(registerClientDTO);
}
}
我有一个 client.service.ts
文件:
// imports here
@Injectable()
export class ClientService {
constructor(
@InjectRepository(ClientEntity)
private readonly clientRepository: Repository<ClientEntity>,
) {}
async create(clientDTO: RegisterClientDTO): Promise<any> {
const { phone } = clientDTO;
console.log(phone); // phone is 8-999-999-99-99, but i want 89999999999
}
}
我可以在服务文件中的 create
方法中这样做:const clearPhone = phone.replace(/[^0-9]/gim, '')
。
但我希望 phone
字段自动转换和验证。也许我可以使用 class-transform
包中的 @Transform
装饰器在 dTO 文件中执行此操作?
您可以像这样使用 @Transform()
实现此目的:
import { Transform } from 'class-transformer';
import { IsNotEmpty } from 'class-validator';
export class RegisterClientDTO {
@IsNotEmpty()
@Transform(value => value.replace(/[^0-9]/gim, ''))
readonly phone: string;
}
并确保在验证管道选项中设置 transform: true
。
另一种选择是为 phone 数字创建一个自定义管道来执行此操作,只需确保如果您使用该路线,您只在具有 phone 数字的对象上使用管道。
我应该在哪里转换来自客户端的收入数据以使用 service.ts 文件中的转换值。
例如,我从客户端获取 JSON-data,如下所示
{
phone: 8-999-999-99-99
}
我有一个 register-client.dto
文件:
import { IsNotEmpty } from 'class-validator';
export class RegisterClientDTO {
@IsNotEmpty()
readonly phone: string;
}
我有一个 client.controller.ts
文件:
// imports here...
@Controller('clients')
export class ClientController {
constructor(private readonly clientService: ClientService) {}
@Post()
@UsePipes(new ValidationPipe())
create(@Body() registerClientDTO: RegisterClientDTO) {
return this.clientService.create(registerClientDTO);
}
}
我有一个 client.service.ts
文件:
// imports here
@Injectable()
export class ClientService {
constructor(
@InjectRepository(ClientEntity)
private readonly clientRepository: Repository<ClientEntity>,
) {}
async create(clientDTO: RegisterClientDTO): Promise<any> {
const { phone } = clientDTO;
console.log(phone); // phone is 8-999-999-99-99, but i want 89999999999
}
}
我可以在服务文件中的 create
方法中这样做:const clearPhone = phone.replace(/[^0-9]/gim, '')
。
但我希望 phone
字段自动转换和验证。也许我可以使用 class-transform
包中的 @Transform
装饰器在 dTO 文件中执行此操作?
您可以像这样使用 @Transform()
实现此目的:
import { Transform } from 'class-transformer';
import { IsNotEmpty } from 'class-validator';
export class RegisterClientDTO {
@IsNotEmpty()
@Transform(value => value.replace(/[^0-9]/gim, ''))
readonly phone: string;
}
并确保在验证管道选项中设置 transform: true
。
另一种选择是为 phone 数字创建一个自定义管道来执行此操作,只需确保如果您使用该路线,您只在具有 phone 数字的对象上使用管道。