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
https://gksdudrb922.tistory.com/224
https://velog.io/@sarifor/0006