개발 마라톤

10/18 - S3Client 업로드 시에 TypeError: Second parameter is not an object. 본문

--- Project ---/CharFlyer : 캐플라이어

10/18 - S3Client 업로드 시에 TypeError: Second parameter is not an object.

망__고 2023. 10. 18. 23:29

TypeError: Second parameter is not an object.

S3Client 업로드 시에 TypeError: Second parameter is not an object. · Issue #36 · 1004ljy980/CharFlyer (github.com)

 

S3Client 업로드 시에 TypeError: Second parameter is not an object. · Issue #36 · 1004ljy980/CharFlyer

문제 Multer를 사용하지 않고 AWS S3 Bucket에 업로드 할 수 있는 방법으로는 S3Client를 이용하는 방법이있다. ( 여담이지만 AWS.S3 객체의 upload를 이용한 방식은 Cannot assign to read only property 'prototype' of fun

github.com

해당 이슈로 정리해두었다.

 

내용을 정리하면 다음과 같다.

const command = new PutObjectCommand({
  Bucket: AWS_S3_BUCKET,
  Key: file.name,
  Body: file,
});

S3Client에 send시 사용하는 PutObjectCommand의 Body의 타입은 다음과 같다.

formData로 받아오는 파일의 기본 형식은 Blob이다.

유의할 점은, Blob 타입으로 보이는BrowserRuntimeStreamingBlobPayloadInputTypes의 BlobOptionalType의 경우,

브라우저 런타임 시 사용되는 Blob 타입으로, 기존의 Node.js Blob 타입과 다른 타입이다.

 

따라서 formData로 받아오는 파일을 그대로 body에 포함시킬 경우

TypeError: Second parameter is not an object.

와 같은 오류가 나타나게 된다.

 

결론적으로는 Node.js 런타임에서 Body를 설정하기 위해서는

NodeJsRuntimeStreamingBlobPayloadInputTypes 의 이름과 같이 그 내부의 타입인 Buffer로 file을 형 변환 시켜주어야 한다.

var arrayBuffer = await blob.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);

단순히 해당 코드로 blob형을 Buffer 형식으로 변환 시킬 수 있으며, 이 buffer를 Body로 보내주게 되면

문제없이 S3Client로 업로드가 가능하다.

Comments