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..
1. More Schema - https://mongoosejs.com/docs/schematypes.html Mongoose v8.8.0: SchemaTypesSchemaTypes handle definition of path defaults, validation, getters, setters, field selection defaults for queries, and other general characteristics for Mongoose document properties. You can think of a Mongoose schema as the configuration object for a Monmongoosejs.com// upload.pugextends baseblock content..
1. Document 만들기 - schema는 video의 구성요소와 데이터 형태를 갖추고 있음 - 유저가 비디오를 업로드할 때 해당 schema의 데이터들을 전송 - 생성일이나 meta 데이터는 자동으로 생성 - 비디오를 생성하려면 document가 필요함 // upload.pugextends baseblock content form(method="POST") input(placeholder="Title", required, type="text", name="title") input(placeholder="Description", required, type="text", name="description") input(placeholder="Hashtags,..
1. import 정리 - 앞으로 import 할 일이 많아질텐데, server.js가 불필요하게 난잡해질 수 있음 - 그리고 이 것들이 server와는 상관이 없으므로 init.js라는 새로운 파일을 생성하고 모든걸 초기화 - 즉 init.js는 필요한 모든 것들을 import 시키는 역할// init.jsimport "./db";import "./models/Video";import app from "./server";const PORT = 4000;const handleListening = () => console.log(`✅ Server listening on port http://localhost:${PORT}`);app.listen(PORT, handleListening);// server...
1. CRUD - Create, Read, Upload, Delete - 기존 프로젝트에 실제 데이터를 사용하여 업로드 구현 - src/models/Video.js 파일 생성 - 파일명을 대문자를 사용하는 것은 mongoose의 규칙 - model은 데이터가 어떻게 생겨먹었는지를 알려주는 것(schema)// src/models/Video.jsimport mongoose from "mongoose";const videoSchema = new mongoose.Schema({ title: String, description: String, createdAt: Date, hashtags: [{ type: String }], meta: { views: Number, rating: Nu..