주민번호 데이터가 들어오면 pipe로 바로 성별 판별해서 db에 전달하기
import { Transform } from 'class-transformer';
@IsNotEmpty()
@Transform(({ obj }) => {
const patientRrn = String(obj.patient_rrn);
return patientRrn[7] === '1' || patientRrn[7] === '3' ? 'M' : 'F';
})
gender: string;
근데 잘 안됐다. 알고보니 transform의 용도를 잘못 파악하고 있었다.
You can perform additional data transformation using the @Transform()
decorator.
@Transform(({ value }) => value.name)
role: RoleEntity;
For example, the following construct returns the name property of the RoleEntity
instead of returning the whole object.
공식문서를 해석하자면, @Transform() 사용시 request로 들어온 role 변수에 할당된 RoleEntity 객체의 name 프로퍼티만을 추출하여 사용하는 것이다. 즉, 이 코드를 사용하면 role.name만 반환되는 것이다.
@Transform()은 내가 원했던 것과 달라서 다른 방식을 생각해보았다.
// patients.controller.ts
@Post('/:report_id')
createPatientInfo(
@Param('report_id') report_id: number,
@Body(new GenderFromRrnPipe()) createPatientInfo: CreatePatientDto, // 주민등록번호를 받으면 자동으로 gender 판정되어 넘겨짐
): Promise<Patients> {
this.logger.verbose('환자 정보 입력 POST API');
return this.patientsService.createPatientInfo(report_id, createPatientInfo);
}
// custom pipe
import { PipeTransform, Injectable } from '@nestjs/common';
@Injectable()
export class GenderFromRrnPipe implements PipeTransform {
transform(value: any): object {
const rrn = value.patient_rrn;
const gender =
rrn[7] === '1' || rrn[7] === '3'
? 'M'
: rrn[7] === '2' || rrn[7] === '4'
? 'W'
: null;
return {
...value,
gender,
};
}
}
이렇게 pipe를 통과해서 data를 transform 해주었다.
좋아요만 누르고 튈려다가 좋아요가 없어서 댓글 남기고 튑니다 꿀 정보 감사합니다👍