Flare-k

[Add] EsLint

1 +module.exports = {
2 + env: {
3 + browser: true,
4 + commonjs: true,
5 + es2020: true,
6 + },
7 + extends: ["airbnb-base", "plugin:prettier/recommended"],
8 + rules: {
9 + "no-console": "off",
10 + },
11 + parserOptions: {
12 + ecmaVersion: 11,
13 + },
14 + rules: {},
15 +};
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 }
......