2021. 3. 4. 12:55ㆍProjects/유튜브 클론코딩
3.9 Editing a Video
이번 시간에는 비디오 수정할 수 있는 버튼 만들기(edit video)를 할 것이다.
비디오를 수정할 수 있는 버튼을 만들어서, 일단은 모든 사람이 수정할 수 있도록 하고
나중에 유저부분에서 해당 버튼은 비디오를 업로드한 사람에게만 보일 수 있도록 수정할 것이다.
routes.js에서 editVideo도 함수 형식으로 바꾸기
editVideo: (id) => {
if(id){
return `/videos/${id}/edit`
}else{
return EDIT_VIDEO;
}
},
↑ routes.js
routes.js로 가서 editVideo 부분을 바꾼다.
editVideo도 id를 받아와야 하기 때문에 함수 형식으로 바꾸는 것이다.
videoDetail.pug에서 비디오를 수정할 수 있는 버튼을 만들기
extends layouts/main
block content
.video__player
video(src=`/${video.fileUrl}`, width="30%", controls=true, autoplay=true)
.video__info
a(href=routes.editVideo(video.id)) Edit Video
h5.video__title=video.title
span.video__views=video.views
p.video__description=video.description
↑ videoDetail.pug
videoController에서 비디오 파일 통째로 줬는데 그 비디오는 id를 가지고 있을 것이므로 저렇게 작성하는 것이다.
import express from "express";
import { deleteVideo, editVideo, getUpload, postUpload, upload, videoDetail, videos } from '../controllers/videoController';
import { uploadVideo } from '../middlewares';
import routes from "../routes";
const videoRouter = express.Router();
videoRouter.get(routes.upload, getUpload);
videoRouter.post(routes.upload, uploadVideo, postUpload);
videoRouter.get(routes.videoDetail(), videoDetail);
videoRouter.get(routes.editVideo(), editVideo);
videoRouter.get(routes.deleteVideo, deleteVideo);
export default videoRouter;
↑ videoRouter.js
그리고 videoRouter에 가서도 함수를 실행해줘야 하므로 이렇게 수정해준다.
export const getEditVideo = (req, res) => {
res.render("editVideo", {pageTitle: "Edit Video"});
}
export const postEditVideo = (req, res) => {
}
↑ videoController.js
이제 videoController로 가서 editVideo 부분을 수정해준다.
기존의 editVideo 함수는 getEditVideo로 수정해주고 postEditVideo 함수를 새로 만든다.
import express from "express";
import { deleteVideo, editVideo, getEditVideo, getUpload, postEditVideo, postUpload, upload, videoDetail, videos } from '../controllers/videoController';
import { uploadVideo } from '../middlewares';
import routes from "../routes";
const videoRouter = express.Router();
videoRouter.get(routes.upload, getUpload);
videoRouter.post(routes.upload, uploadVideo, postUpload);
videoRouter.get(routes.videoDetail(), videoDetail);
videoRouter.get(routes.editVideo(), getEditVideo);
videoRouter.post(routes.editVideo(), postEditVideo);
videoRouter.get(routes.deleteVideo, deleteVideo);
export default videoRouter;
↑ videoRouter.js
videoRouter로 가서 당연히 이 부분도 수정해준다.
어떤 비디오를 수정하는지 알아야 하기 때문에 videoDetail에서 id를 받아온 것처럼 editVideo에서도 id를 받아올 것이다. 그리고 내가 비디오를 수정하려고 한다면 지금처럼 빈칸이 아니라 title과 description이 현재의 제목과 설명으로 채워져있기를 원한다.
getEditVideo 작성하기
export const getEditVideo = async(req, res) => {
const {params: {id}} = req;
try{
const video = await Video.findById(id);
res.render("editVideo", {pageTitle: `Edit ${video.title}`, video});
}catch(error){
res.redirect(routes.home);
}
}
↑ videoController.js
우선 URL로부터 parameter를 받아오도록 한다.
편집할 비디오의 id를 받아와서 그 비디오의 현재의 title과 description을 보여주는 일은 get이 해야하는 일이므로 getEditVideo에서 작성한다.
findById메소드를 통해 id로 찾은 video를 템플릿 변수를 통해 전달해줬기 때문에 이제 저 video를 가지고 editVideo.pug로 간다.
extends layouts/main
block content
.form-container
form(action=routes.editVideo(video.id), method="post")
input(type="text", placeholder="Title", name="title", value=video.title)
textarea(name="description", placeholder="Description")=video.description
input(type="submit" value="Update Video")
a.form-container__link.form-container__link--delete(href=`/videos${routes.deleteVideo}`) Delete Video
↑ editVideo.pug
textarea는 value가 없기 때문에 다음과 같이 작성하면 된다.
여기까지 하면 get 부분은 마무리 되었고 이제 post 부분을 작성한다.
postEditVideo 작성하기
export const postEditVideo = async(req, res) => {
const {
params: {id},
body : {title,description}} = req;
try{
await Video.findOneAndUpdate({ _id: id },{ title, description});
res.redirect(routes.videoDetail(id));
}catch(error){
res.redirect(routes.home);
}
}
_id 이렇게 한 것은 mongoose에서 id를 _id라고 되어있기 때문인 것이다.
findOneAndUpdate 메소드를 통해 id를 기준으로 비디오를 찾고, title과 description를 업데이트 하도록 작성했다. 업데이트가 끝나면 해당 id로 비디오 상세페이지로 redirect 하도록 한다.
만약 에러가 생긴다면 home으로 redirect하도록 작성한다.
'Projects > 유튜브 클론코딩' 카테고리의 다른 글
[유튜브 클론코딩] 3.11 Installing ESLint (0) | 2021.03.04 |
---|---|
[유튜브 클론코딩] 3.10 Deleting a Video (0) | 2021.03.04 |
[유튜브 클론코딩] 3.8 Getting Video by ID (0) | 2021.03.04 |
[유튜브 클론코딩] 3.7 Uploading and Creating a Video part.2 (0) | 2021.03.04 |
[유튜브 클론코딩] 3.6 Uploading and Creating a Video (0) | 2021.03.02 |