이전에 구현한 게시글 업로드를 수정해주어야 합니다.
const onSubmit = () => {
//게시글 없으면 경고
if (!text || !text.trim()) {
return alert("게시글을 작성하세요");
}
const formData = new FormData();
imagePath.forEach((q) => {
formData.append("image", q); //키가 image 백에서 req.body.image
});
formData.append("content", text); //키가 content 백에서 req.body.content
//이미지가 없으면 formData를 쓸 필요가 없지만, multer nono을 써보기 위해
dispatch({ type: ADD_POST_REQUEST, data: formData });
};
//data:{image:~~~~, content:~~~~~};
이런식이라고 봐도 무방합니다.
백앤드 라우터에서는 아까 만든 upload에 none()이라는 매소드를 사용할 것입니다.
//게시글 등록 POST /post
router.post("/", isLoggedIn, upload.none(), async (req, res, next) => {
try {
const post = await Post.create({
content: req.body.content,
UserId: req.user.id,
});
//image는 front에서append로 정해준 키
if (req.body.image) {
if (Array.isArray(req.body.image)) {
//이미지를 여러개 올리면 image:[1.png,2.png]
const images = await Promise.all(
//한번에 모두 완료되면 올려준다.
req.body.image.map((image) => Image.create({ src: image })) //Image 모델에 넣어준다.
);
await post.addImages(images); //Sequelize매소드로 images를 넣어준다.
} else {
//이미지를 하나만 올리면 image:1.png
const image = await Image.create({ src: req.body.image });
await post.addImages(image);
}
}
//DB에는 IMAGE를 올리지 않고 서버에 가지고 있다가 DB에는 경로만 저장하는게 좋음 (DB는 캐싱 불가)
//Image 추가해주기
const fullPost = await Post.findOne({
where: { id: post.id },
include: [
{ model: Image },
{ model: Comment },
{ model: User, attributes: ["id", "nickname"] }, //작성자
{ model: User, as: "Likers", attributes: ["id"] }, //좋아요 누른사람
],
});
res.status(201).json(fullPost); //생성되었다고 프론트로
} catch (e) {
console.error(e);
next(e);
}
});
이미지와 같은 파일들은 캐싱이 가능한데 , DB에 업로드하게 된다면 캐싱이 불가능해집니다.
그런 이유로 DB에는 경로만 적어주고 , 경로를 보내주는 것입니다.