// edit.pug
extends base.pug
block content
h3 Edit
form(method="POST")
input(name="title", placeholder="new title", value=video.title, required, maxlength=50)
input(name="description", placeholder="Description", type="text", required, maxlength=100, value = video.description)
input(name="hashtags", placeholder="Hashtags, separated by comma.", type="text", required, value = video.hashtags.join())
input(type="submit", value="Save")
front 단에서 submit이 이루어지면
videoRouter.route("/:id([0-9a-f]{24})/edit").get(getEdit).post(postEdit);
라우터를 통해 postEdit controller가 실행된다.
export const postEdit = async (req, res) => {
const { title, description, hashtags } = req.body;
const { id } = req.params;
let video = await Video.exists({ _id: id }); // _id가 id인 model(Video)가 존재하는지 true or false를 반환한다.
if (!video) {
return res.render("404", { pageTitle: "404 Error", fakeUser });
} else {
await Video.findByIdAndUpdate(id, {
title,
description,
hashtags: hashtags
.split(",")
.map((word) => (word.startsWith("#") ? word : `#${word}`)),
});
return res.redirect(`/videos/${id}`);
}
};
let video = await Video.exists({ _id: id });
DB안에서 조건에 맞는 data가 있는지 확인하여 boolean을 반환한다.
await Video.findByIdAndUpdate(id, {data})
모델에서 id를 통해 data를 찾은 후 object의 내용을 업데이트한다.
직관적이지만 손이 많이가는 방법
video.title = title;
video.description = description;
video.hashtags = hashtags
.split(",")
.map((word) => (word.startsWith("#") ? word : `#${word}`));
await video.save();
위처럼 model data를 일일히 수정해줄수도 있지만 수정해야 하는 부분이 많으면 코드가 길어지고 효율이 떨어지게 된다.