AWS multer-s3 오류 TypeError: this.client.send is not a function

2023. 7. 21. 20:00에러대응

TypeError: this.client.send is not a function

이 에러는 AWS S3 에 접근할 수 없다는 에러였다.

aws 에 퍼플릭 엑세스로 설정을 바꾼뒤 해결되었다.

이후 다른 문제가 발생했는데, req.file 을 불렀을때 값이 비어있었고, 당연히 req.file.location 도 작동하지 않았다.

아래는 해당 코드이다.

 

// awsMulterModules.js

const multer = require("multer");
const AWS = require("aws-sdk");
const multerS3 = require("multer-s3");
const path = require("path");
require("dotenv").config();

AWS.config.update({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: "ap-northeast-2",
});

module.exports = multer({
  storage: multerS3({
    s3: new AWS.S3(),
    bucket: "mini-be-bucket",
    contentType: multerS3.AUTO_CONTENT_TYPE,
    key(req, file, cb) {
      const filename = path.basename(file.originalname).trim();
      let newFilename = "";
      for (let value of filename) {
        if (value == "" || value === "_") {
          value = "-";
        }
        newFilename += value;
      }
      cb(null, `upload/${Date.now()}-${newFilename}`);
    },
  }),
  limits: {
    fileSize: 100 * 1024 * 1024,
  },
});
// posts.controller.js

const createPost = async (req, res) => {
  try {
    let image = req.file.location;
    if (!image) {
      image = "http://fweusdfn.html";
    }

    const { title, content, imgFile, imgsrc } = await postSchema.validateAsync(
      req.body
    );

    const { userId } = res.locals.user;
    console.log(userId);

    const existUser = await Users.findOne({ where: { userId } });

    if (!existUser) {
      return res
        .status(404)
        .json({ errorMessage: "해당 유저가 존재하지 않습니다. " });
    }

    const savedPost = await Posts.create({
      userId,
      title,
      content,
      name: existUser.name,
      imgsrc: image.replace(/\/original\//, "/thumb/"),
    });
    return res.status(201).json({ message: "게시글을 생성하였습니다." });
  } catch (error) {
    console.log(error);
    if (error.isJoi) {
      return res.status(412).json({ errorMessage: error.message });
    }
    return res
      .status(400)
      .json({ errorMessage: "게시글 생성에 실패하였습니다. " });
  }
};

 

// posts.js

const express = require("express");

const {
  createPost,
  findAllPosts,
  findPost,
  updatePost,
  deletePost,
} = require("../controllers/posts.controller");

const authMiddleware = require("../middleware/auth-middleware");
const upload = require("../multer/awsMulterModules");

const router = express.Router();

router.post("/", authMiddleware, upload.single("imgFile"), createPost);
router.get("/", findAllPosts);
router.get("/:postId", findPost);
router.put("/:postId", authMiddleware, updatePost);
router.delete("/:postId", authMiddleware, deletePost);

module.exports = router;

 

this.client.send is not a function 오류는 SDK가 AWS S3 서비스에 요청을 보내는 데 실패했음을 나타낸다고 한다.

이 부분은 AWS S3 권한 설정을 퍼블릭으로 바꾸니 해결되었다.

 

그리고 req.file 을 못받아 오는 문제가 생겼는데 

원인을 못찾던 중 버전문제라는 것을 보았다.

글에 따르면 multer-s3 와 aws-sdk 모듈이 호환성이 맞아야 한다고 한다.

 

"multer-s3": "^3.0.1",
"aws-sdk": "^2.1148.0",

위 의 코드는 설치되었던 상황이고 아래 명령어를 사용해 버전을 바꿔주었다.

npm i multer-s3@^2 --save

아래처럼 버전이 바뀌었다.

"multer-s3": "^2.10.0",
"aws-sdk": "^2.1148.0",

버전이 바뀌니 잘동작하였고 버전이 정말 중요하다는 것을 알게되었다.

 


 

참고링크

 

https://velog.io/@wngud4950/AWS-multer-s3-upload-%EC%98%A4%EB%A5%98

 

[AWS Error] multer-s3 upload 오류

서버 로그를 보다가 사진 업로드가 제대로 안되고 있다는 걸 알게 되었다.this.client.send is not a function에러가 계속 나고 있었다.원인을 찾아보니 multer-s3, aws-sdk 모듈이 호환성이 맞아야된다고 한다

velog.io

https://gksdudrb922.tistory.com/224

 

[AWS] S3 버킷 퍼블릭 엑세스 설정

AWS S3 버킷을 퍼블릭하게 열어두고 사용할 때가 많다. 이번에는 S3 퍼블릭 엑세스에 대한 기본 세팅을 설명한다. 퍼블릭 엑세스 차단 기본적으로 아무 설정 없이 버킷을 생성하면 모든 퍼블릭 엑

gksdudrb922.tistory.com

https://velog.io/@sarifor/0006

 

[에러] This XML file does not appear to have any style information associated with it. The document tree is shown below.

문제 로그인했는데, 특정 사용자의 프로필 이미지가 보이지 않음. 해결 계정과 버킷의 퍼블릭 액세스 차단을 해제하고, S3 > 이 계정의 퍼블릭 액세스 차단 설정 > 네 항목 모두 해제 S3 >

velog.io