1. 사용할 패키지들 node.js는 기존에 브라우저 안에서만 사용되던 언어였지만 브라우저 밖에서도 사용하기 위해 만들어졌으며, 프론트엔드와 백엔드에서 동시에 사용할 수 있다는 장점이 있다. node.js에는 npm을 통해 패키지를 관리한다. npm init을 사용하여 프로젝트를 생성하고 나면 package.json이 생성된다. json은 데이터를 전송할 때 사용하는 양식이며 package.json에는 해당 프로젝트의 패키지를 관리하기 위한 문서다. 우리가 npm을 사용하여 설치한 모든 것들은 package.json의 dependencies에 기록된다. dependencies는 프로젝트를 실행하기 위한, devDependencies는 개발자를 위한 패키지들이다. express라는 node.js의 프레임워..
1. Cookie Session (1) - 이전까지는 account가 존재하는지, account의 password가 맞는지만 확인하였음 - 이제는 서버가 로그인을 시도한 유저를 기억하는 방법을 알아야 함 - 그 방법 중 하나가 cookie이며, cookie를 이해하기 전 먼저 session에 대해 알아야 함 - session이란, 백엔드와 브라우저 간에 어떤 활동(history)을 했는지 기억(memory)하는걸 말함 - 백엔드와 브라우저간 정보가 있어야 됨 - 현재 home으로 이동하면 GET request가 발생하는데, 백엔드에서 HTML을 render하고 나면 연결이 끝남 - 즉 연결이 지속되지 않는 무상태(stateless) - request를 받고 처리되면 서버도 브라우저도 곧바로 ..
1. Login// userController.jsexport const postJoin = async (req, res) => { const { email, username, password1, password2, name, location } = req.body; if (password1 !== password2) { return res.status(400).render("join", { pageTitle: "Join", errorMessage: "Password confirmation does not match.", }); } const exists = await User.exists({ $or: [{ username }, { email }] }); if (ex..
1. Status Code - 우리가 회원가입을 하고 나면 보통은 브라우저가 아이디와 비밀번호를 저장할건지를 묻는 창이 뜸 - 하지만 회원가입이 정상적으로 완료되었는가를 브라우저가 확인했는지 여부는 여전히 우리가 알 수 없음 - 우리의 회원가입 화면에서는 중복되는 email이나 username이 있으면 여전히 에러메세지가 출력되기 때문 - https://en.wikipedia.org/wiki/List_of_HTTP_status_codes List of HTTP status codes - WikipediaFrom Wikipedia, the free encyclopedia This is a list of Hypertext Transfer Protocol (HTTP) response status codes..
1. Hash - 해킹과 같은 위험에 대비하게 위해 암호를 hash 할거임 - hash는 일방향 함수이며 문자열이 필요 - https://www.npmjs.com/package/bcrypt - 우리는 DB에 암호를 그냥 저장하지 않고, 해싱된 암호를 저장 bcryptA bcrypt library for NodeJS.. Latest version: 5.1.1, last published: a year ago. Start using bcrypt in your project by running `npm i bcrypt`. There are 7172 other projects in the npm registry using bcrypt.www.npmjs.com - 해커가 해싱된 암호를 가지고 공격을 하는걸 rai..
1. 유저 CRUD - 지금까지 video를 CRUD 하면서 배운 것들에 Authentication까지 추가 할 거임 - 유저가 로그인하는 것까지 구현하면서 로그인이 어떤 의미인지를 알아볼 예정 - 그리고 로그인한 유저를 어떻게 기억할지 구현 - 유저 생성에 관한 것들을 배우면서 깃허브에 로그인 하는 것 까지 구현 - 요약하면 ID는 이메일로, 거기에 비밀번호를 추가하고, 깃허브로 소셜 로그인 2. Schema 구성 - Video Model을 만들때와 똑같은 순서 - userSchema를 만들어 MongoDB와 mongoose에 User가 어떻게 생겼는지 알려줌 - static을 만들고 모델을 export 할 예정 - 그리고 이제 globalRouter 대신 rootRouter로 이름을 바꿀 예정// U..
1. Delete Video - 삭제는 template, controller, router 모두 사용해야 됨 - findOneAndDelete와 findOneAndRemove의 차이 - mongoose api에도 나와있지만 웬만하면 findOneAndDelete를 사용하면 된다고 나와있음 - 근데 findByIdAndDelete는 findOneAndDelete({ _id: id })를 줄인 것이므로 findByIdAndDelete 사용 - https://github.com/Daniel-Jeon/wetube-loaded/commit/79eb465f1ee8d6347536ca6c4e444c0b310ad2a9 Delete Video !! · Daniel-Jeon/wetube-loaded@79eb465..
1. findByIdAndUpdate Middleware 생성 - 현재 findOneAndUpdate를 위한 middleware은 있는데 findByIdAndUpdate를 위한 middleware가 없음 - findByIdAndUpdate는 findOneAndUpdate을 호출하는데 findOneAndUpdate는 save hook을 호출하지 않음 - findOneAndUpdate에서는 업데이트하려는 문서에 접근할 수가 없음videoSchema.pre("save", async function () { this.hashtags = this.hashtags[0] .split(",") .map((word) => (word.startsWith("#") ? word : `${word}`));}); ..
1. DeprecationWarning - findByIdAndUpdate를 사용하니 DeprecationWarning라는 경고가 발생함 - 경고 메시지에 나온데로 useFindAndModify를 db에 추가하면 됨// db.jsmongoose.connect("mongodb://127.0.0.1:27017/wetube", { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: true,}); - mongoose가 오래된 것들을 처리하는 방법이라 시키는데로 하면 됨 2. Middleware를 통한 Hashtag 처리 - 현재는 영상을 업로드하거나 수정할 때, model에 저장하기 전에 hashtag를 처리함 - 하지만 영상을 저장하..
1. 영상이 없을 경우export const watch = async (req, res) => { const { id } = req.params; const video = await Video.findById(id); if (!video) { return res.render("404", { pageTitle: "Video not found!" }); } return res.render("watch", { pageTitle: video.title, video });}; - exec()를 붙인다고 해서 달라지는 건 없고 mongoose에서는 우리가 exec()를 호출하면 promise를 return함 - 우리는 async await을 사용중이므로 상관없으니 삭제 - 하지만 누군가가 없는 v..