Showing
4 changed files
with
147 additions
and
123 deletions
.eslintrc.js
0 → 100644
1 | # OSS Term Project using AWS, Node js | 1 | # OSS Term Project using AWS, Node js |
2 | - | 2 | + |
3 | ### 경희대학교 컴퓨터공학과 강연욱 | 3 | ### 경희대학교 컴퓨터공학과 강연욱 |
4 | - | 4 | + |
5 | ## 내용 | 5 | ## 내용 |
6 | - | 6 | + |
7 | - Node.js를 이용하여 나만의 Youtube 사이트를 제작한다. | 7 | - Node.js를 이용하여 나만의 Youtube 사이트를 제작한다. |
8 | - | 8 | + |
9 | ## 기술 Stack | 9 | ## 기술 Stack |
10 | + | ||
10 | 1. Frontend: Vanilla.js | 11 | 1. Frontend: Vanilla.js |
11 | 2. Backend : Node.js | 12 | 2. Backend : Node.js |
12 | 3. Database: mongoDB | 13 | 3. Database: mongoDB |
13 | -4. A W S : EC2 | 14 | +4. A W S : EC2 |
14 | - | ||
15 | 15 | ||
16 | ## Pages: | 16 | ## Pages: |
17 | + | ||
17 | - [ ] Home | 18 | - [ ] Home |
18 | -- [ ] Join | 19 | +- [x] Join |
19 | -- [ ] Login | 20 | +- [x] Login |
20 | - [x] Search | 21 | - [x] Search |
21 | - [ ] User Detail | 22 | - [ ] User Detail |
22 | -- [ ] Edit Profile | 23 | +- [x] Edit Profile |
23 | -- [ ] Change Password | 24 | +- [x] Change Password |
24 | -- [ ] Upload | 25 | +- [x] Upload |
25 | - [ ] Video Detail | 26 | - [ ] Video Detail |
26 | -- [ ] Edit Video | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
27 | +- [x] Edit Video | ... | ... |
1 | import routes from "../routes"; | 1 | import routes from "../routes"; |
2 | import Video from "../models/Video"; | 2 | import Video from "../models/Video"; |
3 | 3 | ||
4 | -//db를 import 해주고 home에 async를 달아준다. async는 기다려주는 역할을 한다. | 4 | +// db를 import 해주고 home에 async를 달아준다. async는 기다려주는 역할을 한다. |
5 | -//javascript가 db를 다 못보고 그냥 지나갈 수도 있기 때문이다. | 5 | +// javascript가 db를 다 못보고 그냥 지나갈 수도 있기 때문이다. |
6 | -//javascript는 기본적으로 기다려주지 않는다. | 6 | +// javascript는 기본적으로 기다려주지 않는다. |
7 | -//async: "JS야 이 function의 ~~부분은 꼭 기다려!" await이 있는 부분까지 기다린다. | 7 | +// async: "JS야 이 function의 ~~부분은 꼭 기다려!" await이 있는 부분까지 기다린다. |
8 | -export const home = async(req, res) => { | 8 | +export const home = async (req, res) => { |
9 | - try { | 9 | + try { |
10 | - const videos = await Video.find({}); //모든 비디오를 가져온다. | 10 | + const videos = await Video.find({}).sort({ _id: -1 }); // 모든 비디오를 가져온다. |
11 | - res.render("home", { pageTitle: "Home", videos }); //render DB에 저장된 video의 내용을 보여준다 | 11 | + res.render("home", { pageTitle: "Home", videos }); // render DB에 저장된 video의 내용을 보여준다 |
12 | - } catch (error) { | 12 | + } catch (error) { |
13 | - console.log(error); | 13 | + console.log(error); |
14 | - res.render("home", { pageTitle: "Home", videos: [] }); | 14 | + res.render("home", { pageTitle: "Home", videos: [] }); |
15 | - } | 15 | + } |
16 | }; | 16 | }; |
17 | 17 | ||
18 | export const search = (req, res) => { | 18 | export const search = (req, res) => { |
19 | - const { | 19 | + const { |
20 | - query: { term: searchingBy }, | 20 | + query: { term: searchingBy }, |
21 | - } = req; // == const searchingBy = req.query.term; | 21 | + } = req; // == const searchingBy = req.query.term; |
22 | - res.render("search", { pageTitle: "Search", searchingBy, videos }); | 22 | + res.render("search", { pageTitle: "Search", searchingBy, videos }); |
23 | }; | 23 | }; |
24 | 24 | ||
25 | -//upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다. | 25 | +// upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다. |
26 | export const getUpload = (req, res) => | 26 | export const getUpload = (req, res) => |
27 | - res.render("upload", { pageTitle: "Upload" }); | 27 | + res.render("upload", { pageTitle: "Upload" }); |
28 | -export const postUpload = async(req, res) => { | 28 | +export const postUpload = async (req, res) => { |
29 | - //const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다. | 29 | + // const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다. |
30 | - //이는 pug와 db.js를 확인해야하는 듯 하다. | 30 | + // 이는 pug와 db.js를 확인해야하는 듯 하다. |
31 | - const { | 31 | + const { |
32 | - body: { title, description }, | 32 | + body: { title, description }, |
33 | - file: { path }, | 33 | + file: { path }, |
34 | - } = req; //file에 path라는 요소가 있다. | 34 | + } = req; // file에 path라는 요소가 있다. |
35 | 35 | ||
36 | - const newVideo = await Video.create({ | 36 | + const newVideo = await Video.create({ |
37 | - fileUrl: path, | 37 | + fileUrl: path, |
38 | - title, | 38 | + title, |
39 | - description, | 39 | + description, |
40 | - //여기있는 fileUrl, title, description은 videoDB의 속성이다. | 40 | + // 여기있는 fileUrl, title, description은 videoDB의 속성이다. |
41 | - }); | 41 | + }); |
42 | - console.log(newVideo); | 42 | + console.log(newVideo); |
43 | - res.redirect(routes.videoDetail(newVideo.id)); //id는 DB의 id | 43 | + res.redirect(routes.videoDetail(newVideo.id)); // id는 DB의 id |
44 | - //id는 mongoDB가 랜덤하게 만들어준다. | 44 | + // id는 mongoDB가 랜덤하게 만들어준다. |
45 | }; | 45 | }; |
46 | 46 | ||
47 | -export const videoDetail = async(req, res) => { | 47 | +export const videoDetail = async (req, res) => { |
48 | - //console.log(req.params); params에 id가 있다는걸 알게 됨 | 48 | + // console.log(req.params); params에 id가 있다는걸 알게 됨 |
49 | - const { | 49 | + const { |
50 | - params: { id }, | 50 | + params: { id }, |
51 | - } = req; | 51 | + } = req; |
52 | - try { | 52 | + try { |
53 | - const video = await Video.findById(id); | 53 | + const video = await Video.findById(id); |
54 | - res.render("videoDetail", { pageTitle: video.title, video }); | 54 | + res.render("videoDetail", { pageTitle: video.title, video }); |
55 | - } catch (error) { | 55 | + } catch (error) { |
56 | - res.redirect(routes.home); | 56 | + res.redirect(routes.home); |
57 | - } | 57 | + } |
58 | }; | 58 | }; |
59 | -export const getEditVideo = async(req, res) => { | 59 | +export const getEditVideo = async (req, res) => { |
60 | - const { | 60 | + const { |
61 | - params: { id }, | 61 | + params: { id }, |
62 | - } = req; | 62 | + } = req; |
63 | - try { | 63 | + try { |
64 | - const video = await Video.findById(id); | 64 | + const video = await Video.findById(id); |
65 | - //video를 받아서 render로 통해 템플릿으로 던져준다, | 65 | + // video를 받아서 render로 통해 템플릿으로 던져준다, |
66 | - res.render("editVideo", { pageTitle: `Edit ${video.title}`, video }); | 66 | + res.render("editVideo", { pageTitle: `Edit ${video.title}`, video }); |
67 | - // rendering하는 순간 템플릿에선 video의 title과 description을 던져준다. | 67 | + // rendering하는 순간 템플릿에선 video의 title과 description을 던져준다. |
68 | - } catch (error) { | 68 | + } catch (error) { |
69 | - res.redirect(routes.home); | 69 | + res.redirect(routes.home); |
70 | - } | 70 | + } |
71 | }; | 71 | }; |
72 | -export const postEditVideo = async(req, res) => { | 72 | +export const postEditVideo = async (req, res) => { |
73 | - const { | 73 | + const { |
74 | - params: { id }, | 74 | + params: { id }, |
75 | - body: { title, description }, | 75 | + body: { title, description }, |
76 | - } = req; | 76 | + } = req; |
77 | - try { | 77 | + try { |
78 | - //id를 찾아서 body를 얻어와야 한다. 비디오 수정에서 제목과 설명을 가져와야 하기 때문이다. | 78 | + // id를 찾아서 body를 얻어와야 한다. 비디오 수정에서 제목과 설명을 가져와야 하기 때문이다. |
79 | - //mongoose엔 우리의 id가 없어서 _id : id로 찾아줘야 한다. | 79 | + // mongoose엔 우리의 id가 없어서 _id : id로 찾아줘야 한다. |
80 | - await Video.findOneAndUpdate({ _id: id }, { title, description }); //title:title == title | 80 | + await Video.findOneAndUpdate({ _id: id }, { title, description }); //title:title == title |
81 | - //이렇게 하면 default로 얻어온 제목 및 내용을 수정하여 form을 전송하면 해당 내용으로 업데이트 된다. | 81 | + // 이렇게 하면 default로 얻어온 제목 및 내용을 수정하여 form을 전송하면 해당 내용으로 업데이트 된다. |
82 | - res.redirect(routes.videoDetail(id)); | 82 | + res.redirect(routes.videoDetail(id)); |
83 | - } catch (error) { | 83 | + } catch (error) { |
84 | - res.redirect(routes.home); | 84 | + res.redirect(routes.home); |
85 | - } | 85 | + } |
86 | }; | 86 | }; |
87 | 87 | ||
88 | -export const deleteVideo = async(req, res) => { | ||
89 | - const { | ||
90 | - params: { id }, | ||
91 | - } = req; | ||
92 | - try { | ||
93 | - await Video.findOneAndRemove({ _id: id }); | ||
94 | - } catch (error) {} | ||
95 | - //삭제를 실패하던 성공하던 home으로 redirect한다. | ||
96 | - res.redirect(routes.home); | ||
97 | -}; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
88 | +export const deleteVideo = async (req, res) => { | ||
89 | + const { | ||
90 | + params: { id }, | ||
91 | + } = req; | ||
92 | + try { | ||
93 | + await Video.findOneAndRemove({ _id: id }); | ||
94 | + } catch (error) { | ||
95 | + console.log(error); | ||
96 | + } | ||
97 | + // 삭제를 실패하던 성공하던 home으로 redirect한다. | ||
98 | + res.redirect(routes.home); | ||
99 | +}; | ... | ... |
1 | { | 1 | { |
2 | - "name": "myyoutube", | 2 | + "name": "myyoutube", |
3 | - "version": "1.0.0", | 3 | + "version": "1.0.0", |
4 | - "description": "make Youtube Website", | 4 | + "description": "make Youtube Website", |
5 | - "main": "app.js", | 5 | + "main": "app.js", |
6 | - "scripts": { | 6 | + "scripts": { |
7 | - "start": "nodemon --exec babel-node init.js --delay 2" | 7 | + "start": "nodemon --exec babel-node init.js --delay 2" |
8 | - }, | 8 | + }, |
9 | - "repository": { | 9 | + "repository": { |
10 | - "type": "git", | 10 | + "type": "git", |
11 | - "url": "ssh://git@khuhub.khu.ac.kr:12959/2017110267/myYoutube.git" | 11 | + "url": "ssh://git@khuhub.khu.ac.kr:12959/2017110267/myYoutube.git" |
12 | - }, | 12 | + }, |
13 | - "author": "Kang Yeon Wook", | 13 | + "author": "Kang Yeon Wook", |
14 | - "license": "ISC", | 14 | + "license": "ISC", |
15 | - "dependencies": { | 15 | + "dependencies": { |
16 | - "@babel/core": "^7.9.6", | 16 | + "@babel/core": "^7.9.6", |
17 | - "@babel/node": "^7.8.7", | 17 | + "@babel/node": "^7.8.7", |
18 | - "@babel/preset-env": "^7.9.6", | 18 | + "@babel/preset-env": "^7.9.6", |
19 | - "body-parser": "^1.19.0", | 19 | + "body-parser": "^1.19.0", |
20 | - "cookie-parser": "^1.4.5", | 20 | + "cookie-parser": "^1.4.5", |
21 | - "dotenv": "^8.2.0", | 21 | + "dotenv": "^8.2.0", |
22 | - "express": "^4.17.1", | 22 | + "express": "^4.17.1", |
23 | - "helmet": "^3.22.0", | 23 | + "helmet": "^3.22.0", |
24 | - "mongoose": "^5.9.15", | 24 | + "mongoose": "^5.9.15", |
25 | - "morgan": "^1.10.0", | 25 | + "morgan": "^1.10.0", |
26 | - "multer": "^1.4.2", | 26 | + "multer": "^1.4.2", |
27 | - "pug": "^2.0.4" | 27 | + "pug": "^2.0.4" |
28 | - }, | 28 | + }, |
29 | - "devDependencies": { | 29 | + "devDependencies": { |
30 | - "nodemon": "^2.0.4" | 30 | + "eslint": "^6.8.0", |
31 | - } | 31 | + "eslint-config-airbnb-base": "^14.1.0", |
32 | + "eslint-config-prettier": "^6.11.0", | ||
33 | + "eslint-plugin-import": "^2.21.1", | ||
34 | + "eslint-plugin-prettier": "^3.1.3", | ||
35 | + "nodemon": "^2.0.4", | ||
36 | + "prettier": "^2.0.5" | ||
37 | + } | ||
32 | } | 38 | } | ... | ... |
-
Please register or login to post a comment