1

我应该在哪里转换来自客户的收入数据以使用 service.ts 文件中的转换值。

例如,我从客户端获取 JSON 数据,如下所示

{
 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字段自动转换和验证。@Transform也许我可以使用包中的装饰器在 dTO 文件中执行此操作class-transform

4

1 回答 1

1

您可能可以通过以下方式实现此目的@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在验证管道选项中进行设置。

另一种选择是为执行此操作的电话号码创建自定义管道,只需确保如果您使用该路线,则仅在具有电话号码的对象上使用管道。

于 2019-12-06T16:16:55.113 回答