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()
Mongoose v8.8.0: Model
Parameters: doc «Object» values for initial set [fields] «Object» optional object containing the fields that were selected in the query which returned this document. You do not need to set this parameter to ensure Mongoose handles your query projection
mongoosejs.com
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 |