1. 영상이 없을 경우
export const watch = async (req, res) => {
const { id } = req.params;
const video = await Video.findById(id);
if (!video) {
return res.render("404", { pageTitle: "Video not found!" });
}
return res.render("watch", { pageTitle: video.title, video });
};
- exec()를 붙인다고 해서 달라지는 건 없고 mongoose에서는 우리가 exec()를 호출하면 promise를 return함
- 우리는 async await을 사용중이므로 상관없으니 삭제
- 하지만 누군가가 없는 video 페이지에 방문했을 때 문제가 발생할 수 있음
- 우리는 개발할 때 동작되기 위해 만드는 과정 뿐만 아니라 유저의 돌발행동을 항상 염두해야함
- if문을 이렇게 처리한 이유는, 에러를 먼저 처리하기 위함(정답은 없음)
- 에러를 확인하고 문제가 없다면 이후의 코드들은 정상적으로 작동하게 하기 위함
2. getEdit 수정
// videoController.js
export const getEdit = async (req, res) => {
const { id } = req.params;
const video = await Video.findById(id);
if (!video) {
return res.render("404", { pageTitle: "Video not found!" });
}
return res.render("edit", { pageTitle: `Editing ${video.title}`, video });
};
// edit.pug
extends base
block content
h4 Change Title of Video
form(method="POST")
input(placeholder="Title", required, type="text", name="title", maxlength=80, value=video.title)
input(placeholder="Description", required, type="text", name="description", minlength=20, value=video.description)
input(placeholder="Hashtags, seperated by comma.", required, type="text", name="hashtags", value=video.hashtags.join())
input(value="Save", type="submit")
- 조건문안에서 리턴을 하지 않으면 영상이 존재하지 않을 때도 조건문을 실행한다음 마지막 리턴까지 하게 되므로 조심
- 이제 영상을 수정하려고 하면, 이전의 값들을 잘 가져오지만 hashtags는 string array인 상태 - 유저가 작성할 때 처럼 값이 나오게 format 해줘야 하므로 join 사용
3-1. postEdit 수정
- 영상의 내용이 실질적으로 수정되야 하므로 post request를 보내야함
- postEdit이 어떤 정보를 받을지 console.log(req.body)로 확인
- 수정된 값이 log에 잘 나오지만, db에 업데이트 되지않음
- 해당 영상의 정보를 가져온후 수정을 해야하는데 두가지 방법이 있음
- 당연하게도 한가지는 하나하나 수정하는 것
export const postEdit = async (req, res) => {
const { id } = req.params;
const { title, description, hashtags } = req.body;
const video = await Video.findById(id);
if (!video) {
return res.render("404", { pageTitle: "Video not found!" });
}
video.title = title;
video.description = description;
video.hashtags = hashtags.split(",").map((word) => `#${word}`);
await video.save();
return res.redirect(`/videos/${id}`);
};
- 보는 바와 같이 굉장히 귀찮으며, 업데이트할 내용이 많아지면 문제가 발생할 수 있음
- 여기서 문제는 hashtag에 #이 그대로 남아있어서 내용을 수정할 때마다 #이 늘어남
video.hashtags = hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`));
- 이렇게 해결할 수 있지만 여전히 구린데, 이 후에 수정
3-2. postEdit 수정
- 기존에는 영상을 만들고 저장했으나, 이번에는 한번에 마무리하는 function을 만들거임
- https://mongoosejs.com/docs/api/model.html#Model.findByIdAndUpdate()
export const postEdit = async (req, res) => {
const { id } = req.params;
const { title, description, hashtags } = req.body;
const video = await Video.findById(id);
if (!video) {
return res.render("404", { pageTitle: "Video not found!" });
}
await Video.findByIdAndUpdate(id, {
title,
description,
hashtags: hashtags
.split(",")
.map((word) => (word.startsWith("#") ? word : `#${word}`)),
});
return res.redirect(`/videos/${id}`);
};
- 우리는 지금까지 db에 영상이 있는지 확인할 때 object 전체를 검색했었음
export const postEdit = async (req, res) => {
const { id } = req.params;
const { title, description, hashtags } = req.body;
const video = await Video.exists({ _id: id });
- 기존 방법 대신 exists를 사용하면 return으로 boolean값을 받음
export const getEdit = async (req, res) => {
const { id } = req.params;
const video = await Video.findById(id);
if (!video) {
return res.render("404", { pageTitle: "Video not found!" });
}
return res.render("edit", { pageTitle: `Editing ${video.title}`, video });
};
- 하지만 getEdit에선 findById를 써야하는데, 우린 object를 edit으로 보내줘야함
- postEdit에선 해당 영상의 유무만 필요하므로, 상황에 맞게 써야함
'개발 > Node.js' 카테고리의 다른 글
Mongoose Middleware(2) (0) | 2024.11.04 |
---|---|
Mongoose Middleware(1) (0) | 2024.11.04 |
More Schema, Router 수정 (0) | 2024.11.04 |
실제 데이터를 입력해보기 (0) | 2024.11.04 |
Callback Promise Return Render (0) | 2024.11.02 |