const formData = new FormData();
for (const key in values) {
formData.append(key, values[key]);
}
// items 필드를 JSON 문자열로 변환하여 추가
if (values.items) {
formData.append('items', JSON.stringify(values.items));
}
// controller
@GenerateSwaggerApiDoc({
summary: '마켓 상품 등록',
description: '상품을 마켓에 등록합니다.',
})
@Post('products')
@ApiConsumes('multipart/form-data')
@UseInterceptors(
FileFieldsInterceptor([
{ name: 'img', maxCount: 1 },
{ name: 'imgDetail', maxCount: 1 },
]),
)
async createMarketProduct(
@Body() request: RequestCreateProductsDto,
@UploadedFiles() files: { img: Express.Multer.File[]; imgDetail: Express.Multer.File[] },
): Promise<unknown> {
if (files.img) request.img = files.img[0];
if (files.imgDetail) request.imgDetail = files.imgDetail[0];
await this.marketsService.createMarketProduct(request);
return response({}, '상품이 등록되었습니다.');
}
multipart/form-data
하였기 때문에 프론트 호출부에 하지 않았다. 근데 찾아보니 하는것이 좋다고 하네..// dto 수정 전
@ApiProperty({ description: '아이템 리스트', type: [Item], required: true })
@ValidateNested({ each: true })
@IsArray()
@IsNotEmpty()
@Type(() => Item)
@Transform(({ value }) => {
if (typeof value === 'string') {
try {
return JSON.parse(value);
} catch (error) {
throw new Error('Invalid JSON string');
}
}
return value;
})
items: Item[];
// dto 수정 후
@ApiProperty({ description: '아이템 리스트', type: [Item], required: true })
@ValidateNested({ each: true })
@IsArray()
@IsNotEmpty()
@Type(() => Item)
@Transform(({ value }) => {
if (typeof value === 'string') {
try {
return JSON.parse(value).map((item: Item) => plainToInstance(Item, item));
} catch (error) {
throw new Error('Invalid JSON string');
}
}
return value;
})
items: Item[];
이거 말고도 프론트의 File과 타입 이슈.. 등등 때문에 기존 input에서 File로 변경하는 작업만 2.5일정도 소요됐다.. ㅜㅜ
crud에 화면 만드는데는 5일이 소요됐는데..