Toggle navigation
Toggle navigation
This project
Loading...
Sign in
강연욱
/
myYoutube
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
2
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
Flare-k
2020-06-09 00:49:01 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
154f701c63d114fca0dc18e96814d4b8360d811a
154f701c
1 parent
3f532503
[Add] EsLint
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
147 additions
and
123 deletions
.eslintrc.js
README.md
controllers/videoController.js
package.json
.eslintrc.js
0 → 100644
View file @
154f701
module
.
exports
=
{
env
:
{
browser
:
true
,
commonjs
:
true
,
es2020
:
true
,
},
extends
:
[
"airbnb-base"
,
"plugin:prettier/recommended"
],
rules
:
{
"no-console"
:
"off"
,
},
parserOptions
:
{
ecmaVersion
:
11
,
},
rules
:
{},
};
README.md
View file @
154f701
# OSS Term Project using AWS, Node js
### 경희대학교 컴퓨터공학과 강연욱
## 내용
-
Node.js를 이용하여 나만의 Youtube 사이트를 제작한다.
## 기술 Stack
1.
Frontend: Vanilla.js
2.
Backend : Node.js
3.
Database: mongoDB
4.
A W S : EC2
4.
A W S : EC2
## Pages:
-
[
]
Home
-
[
]
Join
-
[
]
Login
-
[
x
]
Join
-
[
x
]
Login
-
[
x
]
Search
-
[
]
User Detail
-
[
]
Edit Profile
-
[
]
Change Password
-
[
]
Upload
-
[
x
]
Edit Profile
-
[
x
]
Change Password
-
[
x
]
Upload
-
[
]
Video Detail
-
[
]
Edit Video
\ No newline at end of file
-
[
x
]
Edit Video
...
...
controllers/videoController.js
View file @
154f701
import
routes
from
"../routes"
;
import
Video
from
"../models/Video"
;
//db를 import 해주고 home에 async를 달아준다. async는 기다려주는 역할을 한다.
//javascript가 db를 다 못보고 그냥 지나갈 수도 있기 때문이다.
//javascript는 기본적으로 기다려주지 않는다.
//async: "JS야 이 function의 ~~부분은 꼭 기다려!" await이 있는 부분까지 기다린다.
export
const
home
=
async
(
req
,
res
)
=>
{
try
{
const
videos
=
await
Video
.
find
({});
//
모든 비디오를 가져온다.
res
.
render
(
"home"
,
{
pageTitle
:
"Home"
,
videos
});
//
render DB에 저장된 video의 내용을 보여준다
}
catch
(
error
)
{
console
.
log
(
error
);
res
.
render
(
"home"
,
{
pageTitle
:
"Home"
,
videos
:
[]
});
}
//
db를 import 해주고 home에 async를 달아준다. async는 기다려주는 역할을 한다.
//
javascript가 db를 다 못보고 그냥 지나갈 수도 있기 때문이다.
//
javascript는 기본적으로 기다려주지 않는다.
//
async: "JS야 이 function의 ~~부분은 꼭 기다려!" await이 있는 부분까지 기다린다.
export
const
home
=
async
(
req
,
res
)
=>
{
try
{
const
videos
=
await
Video
.
find
({}).
sort
({
_id
:
-
1
});
//
모든 비디오를 가져온다.
res
.
render
(
"home"
,
{
pageTitle
:
"Home"
,
videos
});
//
render DB에 저장된 video의 내용을 보여준다
}
catch
(
error
)
{
console
.
log
(
error
);
res
.
render
(
"home"
,
{
pageTitle
:
"Home"
,
videos
:
[]
});
}
};
export
const
search
=
(
req
,
res
)
=>
{
const
{
query
:
{
term
:
searchingBy
},
}
=
req
;
// == const searchingBy = req.query.term;
res
.
render
(
"search"
,
{
pageTitle
:
"Search"
,
searchingBy
,
videos
});
const
{
query
:
{
term
:
searchingBy
},
}
=
req
;
// == const searchingBy = req.query.term;
res
.
render
(
"search"
,
{
pageTitle
:
"Search"
,
searchingBy
,
videos
});
};
//upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다.
//
upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다.
export
const
getUpload
=
(
req
,
res
)
=>
res
.
render
(
"upload"
,
{
pageTitle
:
"Upload"
});
export
const
postUpload
=
async
(
req
,
res
)
=>
{
//
const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다.
//
이는 pug와 db.js를 확인해야하는 듯 하다.
const
{
body
:
{
title
,
description
},
file
:
{
path
},
}
=
req
;
//
file에 path라는 요소가 있다.
res
.
render
(
"upload"
,
{
pageTitle
:
"Upload"
});
export
const
postUpload
=
async
(
req
,
res
)
=>
{
//
const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다.
//
이는 pug와 db.js를 확인해야하는 듯 하다.
const
{
body
:
{
title
,
description
},
file
:
{
path
},
}
=
req
;
//
file에 path라는 요소가 있다.
const
newVideo
=
await
Video
.
create
({
fileUrl
:
path
,
title
,
description
,
//
여기있는 fileUrl, title, description은 videoDB의 속성이다.
});
console
.
log
(
newVideo
);
res
.
redirect
(
routes
.
videoDetail
(
newVideo
.
id
));
//
id는 DB의 id
//
id는 mongoDB가 랜덤하게 만들어준다.
const
newVideo
=
await
Video
.
create
({
fileUrl
:
path
,
title
,
description
,
//
여기있는 fileUrl, title, description은 videoDB의 속성이다.
});
console
.
log
(
newVideo
);
res
.
redirect
(
routes
.
videoDetail
(
newVideo
.
id
));
//
id는 DB의 id
//
id는 mongoDB가 랜덤하게 만들어준다.
};
export
const
videoDetail
=
async
(
req
,
res
)
=>
{
//
console.log(req.params); params에 id가 있다는걸 알게 됨
const
{
params
:
{
id
},
}
=
req
;
try
{
const
video
=
await
Video
.
findById
(
id
);
res
.
render
(
"videoDetail"
,
{
pageTitle
:
video
.
title
,
video
});
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
export
const
videoDetail
=
async
(
req
,
res
)
=>
{
//
console.log(req.params); params에 id가 있다는걸 알게 됨
const
{
params
:
{
id
},
}
=
req
;
try
{
const
video
=
await
Video
.
findById
(
id
);
res
.
render
(
"videoDetail"
,
{
pageTitle
:
video
.
title
,
video
});
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
};
export
const
getEditVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
}
=
req
;
try
{
const
video
=
await
Video
.
findById
(
id
);
//
video를 받아서 render로 통해 템플릿으로 던져준다,
res
.
render
(
"editVideo"
,
{
pageTitle
:
`Edit
${
video
.
title
}
`
,
video
});
// rendering하는 순간 템플릿에선 video의 title과 description을 던져준다.
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
export
const
getEditVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
}
=
req
;
try
{
const
video
=
await
Video
.
findById
(
id
);
//
video를 받아서 render로 통해 템플릿으로 던져준다,
res
.
render
(
"editVideo"
,
{
pageTitle
:
`Edit
${
video
.
title
}
`
,
video
});
// rendering하는 순간 템플릿에선 video의 title과 description을 던져준다.
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
};
export
const
postEditVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
body
:
{
title
,
description
},
}
=
req
;
try
{
//
id를 찾아서 body를 얻어와야 한다. 비디오 수정에서 제목과 설명을 가져와야 하기 때문이다.
//
mongoose엔 우리의 id가 없어서 _id : id로 찾아줘야 한다.
await
Video
.
findOneAndUpdate
({
_id
:
id
},
{
title
,
description
});
//title:title == title
//
이렇게 하면 default로 얻어온 제목 및 내용을 수정하여 form을 전송하면 해당 내용으로 업데이트 된다.
res
.
redirect
(
routes
.
videoDetail
(
id
));
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
export
const
postEditVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
body
:
{
title
,
description
},
}
=
req
;
try
{
//
id를 찾아서 body를 얻어와야 한다. 비디오 수정에서 제목과 설명을 가져와야 하기 때문이다.
//
mongoose엔 우리의 id가 없어서 _id : id로 찾아줘야 한다.
await
Video
.
findOneAndUpdate
({
_id
:
id
},
{
title
,
description
});
//title:title == title
//
이렇게 하면 default로 얻어온 제목 및 내용을 수정하여 form을 전송하면 해당 내용으로 업데이트 된다.
res
.
redirect
(
routes
.
videoDetail
(
id
));
}
catch
(
error
)
{
res
.
redirect
(
routes
.
home
);
}
};
export
const
deleteVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
}
=
req
;
try
{
await
Video
.
findOneAndRemove
({
_id
:
id
});
}
catch
(
error
)
{}
//삭제를 실패하던 성공하던 home으로 redirect한다.
res
.
redirect
(
routes
.
home
);
};
\ No newline at end of file
export
const
deleteVideo
=
async
(
req
,
res
)
=>
{
const
{
params
:
{
id
},
}
=
req
;
try
{
await
Video
.
findOneAndRemove
({
_id
:
id
});
}
catch
(
error
)
{
console
.
log
(
error
);
}
// 삭제를 실패하던 성공하던 home으로 redirect한다.
res
.
redirect
(
routes
.
home
);
};
...
...
package.json
View file @
154f701
{
"name"
:
"myyoutube"
,
"version"
:
"1.0.0"
,
"description"
:
"make Youtube Website"
,
"main"
:
"app.js"
,
"scripts"
:
{
"start"
:
"nodemon --exec babel-node init.js --delay 2"
},
"repository"
:
{
"type"
:
"git"
,
"url"
:
"ssh://git@khuhub.khu.ac.kr:12959/2017110267/myYoutube.git"
},
"author"
:
"Kang Yeon Wook"
,
"license"
:
"ISC"
,
"dependencies"
:
{
"@babel/core"
:
"^7.9.6"
,
"@babel/node"
:
"^7.8.7"
,
"@babel/preset-env"
:
"^7.9.6"
,
"body-parser"
:
"^1.19.0"
,
"cookie-parser"
:
"^1.4.5"
,
"dotenv"
:
"^8.2.0"
,
"express"
:
"^4.17.1"
,
"helmet"
:
"^3.22.0"
,
"mongoose"
:
"^5.9.15"
,
"morgan"
:
"^1.10.0"
,
"multer"
:
"^1.4.2"
,
"pug"
:
"^2.0.4"
},
"devDependencies"
:
{
"nodemon"
:
"^2.0.4"
}
"name"
:
"myyoutube"
,
"version"
:
"1.0.0"
,
"description"
:
"make Youtube Website"
,
"main"
:
"app.js"
,
"scripts"
:
{
"start"
:
"nodemon --exec babel-node init.js --delay 2"
},
"repository"
:
{
"type"
:
"git"
,
"url"
:
"ssh://git@khuhub.khu.ac.kr:12959/2017110267/myYoutube.git"
},
"author"
:
"Kang Yeon Wook"
,
"license"
:
"ISC"
,
"dependencies"
:
{
"@babel/core"
:
"^7.9.6"
,
"@babel/node"
:
"^7.8.7"
,
"@babel/preset-env"
:
"^7.9.6"
,
"body-parser"
:
"^1.19.0"
,
"cookie-parser"
:
"^1.4.5"
,
"dotenv"
:
"^8.2.0"
,
"express"
:
"^4.17.1"
,
"helmet"
:
"^3.22.0"
,
"mongoose"
:
"^5.9.15"
,
"morgan"
:
"^1.10.0"
,
"multer"
:
"^1.4.2"
,
"pug"
:
"^2.0.4"
},
"devDependencies"
:
{
"eslint"
:
"^6.8.0"
,
"eslint-config-airbnb-base"
:
"^14.1.0"
,
"eslint-config-prettier"
:
"^6.11.0"
,
"eslint-plugin-import"
:
"^2.21.1"
,
"eslint-plugin-prettier"
:
"^3.1.3"
,
"nodemon"
:
"^2.0.4"
,
"prettier"
:
"^2.0.5"
}
}
...
...
Please
register
or
login
to post a comment