[Node.js] TypeError: this.client.send is not a function (multer-s3, aws-sdk 패키지)

sukyeongs·2023년 3월 1일
0

요약

multeraws-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 패키지를 사용하는 방법을 찾았다.


1) S3Client 선언

const { S3Client } = require("@aws-sdk/client-s3");

@aws-sdk/client-s3 라이브러리 내용을 담고 있는 S3Client 변수를 생성한다.


2) 사용할 s3 선언

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" 으로 세팅했다.

필요에 맞는 타입을 입력해주면 된다.


3) multer 라이브러리로 버킷에 파일 업로드 로직 구현

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(저장 경로, 이름)을 설정한다.


구현 성공 ! !

profile
꺌꺌률리

0개의 댓글