multer
와aws-sdk
패키지의 버전을 맞춰주어야 한다.
AWS의 S3 버킷에 파일을 업로드하는 기능을 구현하기 위하여
multer
multer-s3
aws-sdk
패키지를 사용하는데,
TypeError: this.client.send is not a function
에러가 발생했다.
또한 서버를 실행시킬 때마다
위와 같은 메시지가 떴다.
찾아보니 위 에러는 multer-s3
패키지와 aws-sdk
패키지의 버전이 다르면 발생하는 문제라고 한다.
(참고 링크: https://github.com/anacronw/multer-s3/issues/169)
package.json
을 확인해보니
"dependencies": {
...
"multer-s3": "^3.0.1",
"aws-sdk": "^2.1323.0"
}
aws-sdk
패키지는 2.XX, multer-s3
패키지는 3.XX 임을 확인했다.
aws-sdk
의 버전을 업그레이드 하든 multer-s3
의 버전을 다운그레이드 해야 하는데, 필자는 aws-sdk
패키지의 버전을 업그레이드 했다!
aws-sdk
의 버전을 업그레이드하기 위한 방법을 찾아보니 해당 패키지의 버전을 그대로 업그레이드하는 것은 없었고,
대신 @aws-sdk/client-s3
패키지를 사용하는 방법을 찾았다.
const { S3Client } = require("@aws-sdk/client-s3");
@aws-sdk/client-s3
라이브러리 내용을 담고 있는 S3Client
변수를 생성한다.
const s3 = new S3Client({
region: "ap-northeast-2",
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
});
필자의 경우, Excel 파일을 업로드/다운로드하는 기능을 구현하고자 했기 때문에, contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
으로 세팅했다.
필요에 맞는 타입을 입력해주면 된다.
const multer = require("multer");
const multerS3 = require("multer-s3");
const path = require("path");
...
const upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.S3_BUCKET_NAME,
acl: "public-read",
contentType: multerS3.AUTO_CONTENT_TYPE,
key: function (req, file, callback) {
const extension = path.extname(file.originalname);
if (!allowedExtensions.includes(extension)) {
return callback(new Error("wrong extension"));
}
callback(null, "companise/" + `${Date.now()}_${file.originalname}`);
},
}),
});
multer
라이브러리는 위에서도 언급했다시피, 자바스크립트 기반 모듈로 파일 업로드 기능을 구현하기 위해 필요한 라이브러리이다.
multer-s3
라이브러리는 사용자가 업로드한 파일을 s3에 업로드하는 기능을 구현하기 위해 필요한 라이브러리이다.
위처럼 multer
로 node.js express 프레임워크를 통해 사용자가 업로드한 파일을 저장할 storage를 지정한다.
multerS3
로 파일을 저장할 storage를 s3로 지정한다.
연동할 s3와 버킷이름, ACL, 업로드할 파일 타입, key(저장 경로, 이름)을 설정한다.
구현 성공 ! !