- url로 보내달라고 한 말에 의미를 잘 모르겠어서
- 다른 프론트엔드분을 붙잡고 물어봤다(팀원에게는 이미 많이 물어봐도 모르겠어서)
- 그런데 프론트(리액트)에서는 파일의 경로로 넘겨주면
- 사용할 수 없다고 한다.
- 그래서 파일을 내려줄 때 웹상에서 클릭하면 이미지파일이 뜨는식으로 보내줘야한다고 한다.
- 그래서 처음에는 multer의 기능을 사용해 destination을 서버배포주소로 했더니
- 원하는 결과물을 가질 수 있었다.
- 그런데 백엔드 팀원이 모듈화하셨다고 해서 그냥 내거 지우고 모듈화 한 파일을 받았다.
- 근데 내 방식으로 하니까 갑자기 인증 에러가 뜸
- 아니 왜 인증에러가 뜨지..
- 해서 팀원분이 수동으로 img path를 바꾸셨다.
- 그런데 또 작동 안됨
- 알고보니 라우터에 전부 다 validation을 하게끔 되어있었다.
- 라우터 설정하는 폴더가 총 두군데 있는데 한군데만 확인해서 발생했다. 아니 세군데구나..
- 이런일이 있어서 라우터/컨트롤러 최대한 이렇게 기능별로 나누었으면 좋겠다는 생각이 들었다.
imgUpload middleware.js
const path = require("path")
const multer = require("multer")
const upload = multer({
storage: multer.diskStorage({
destination(req, file, done) {
done(null, "uploads/")
},
filename(req, file, done) {
const ext = path.extname(file.originalname)
done(null, path.basename(file.originalname, ext) + Date.now() + ext)
},
}),
})
module.exports = upload
controller.js
exports.postUpload = async (req, res) => {
//login user정보
const userId = res.locals.user;
const {
params: { category },
body: { title, content }
} = req;
const img = req.file.path
//이미지파일 경로 수정하는 코드
// 서버에서는 '/', 윈도우에서는 '\\'
const temp = img.split('/')[1]
const fullimgpath = 'http://15.164.164.65/' + temp
//TODO: save image, path
try {
...
const newPost = await Post.create({
title,
content,
user,
category,
img: fullimgpath,
});
res.send({ newPost });
} catch (error) {
//multer 에러핸들링
if (error instanceof multer.MulterError) {
res.status(400).send({
errormessage: "파일 업로드 중 오류가 발생했습니다.",
});
//이외의 에러 핸들
} else {
res.status(400).send({
errormessage: "게시글 업로드 중 오류가 발생했습니다.",
});
}
console.log(error);
}
};