[TIL] 211225

Lee Syong·2021년 12월 25일
0

TIL

목록 보기
129/204
post-thumbnail

📝 오늘 한 것

  1. 복습 - MONGODB AND MONGOOSE

  2. 복습 - USER AUTHENTICATION


📚 배운 것 (복습)

실제 코드는 github에 올림(wetube_v2)

3. MONGODB AND MONGOOSE

  • [TIL] 211125

    • WSL(Ubuntu 20.04)에 MongoDB(버전 5.0) 설치
    • Mongoose 설치 및 MongoDB 연결
  • [TIL] 211126

    • Video 스키마 및 모델
    • server.js와 init.js 분리
    • CRUD 구현 - home / upload / watch
  • [TIL] 211127

    • CRUD 구현 - edit / delete / search
    • 해시태그 포맷 - pre hook / export 포맷 함수 & import / static(사용자 )
    • req.params / req.body / req.query
    • 검색 조건 개선 (with 정규 표현식)

💡 해시태그 포맷

  • 방법 1 (pre hook 이용)
    DB update 시에는 사용 못 함
// Video.js
videoSchema.pre("save", async function () {
  // form에서 받아온 hashtags가 아니라 schema의 hashtags라서 문자열 아니고 배열 형태 ❗
  this.hashtags = await this.hashtags[0]
    .split(",")
    .map((word) => (word.startsWith("#") ? word : `#${word}`));
});
  • 방법 2 (formatHashtags 함수 export & import)
// Video.js
export const formatHashtags = (hashtags) =>
  hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`));
// videoController.js
import Video, { formatHashtags } from "../models/Video";

export const postEdit = async (req, res) => {
  // 중략
  await Video.findByIdAndUpdate(id, {
    title,
    description,
    hashtags: formatHashtags(hashtags),
  });
  // 중략
};
  • 방법3 (query 직접 만들기)
// Video.js
videoSchema.static("formatHashtags", function(hashtags) {
  return hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`));
})
// videoController.js
export const postEdit = async (req, res) => {
  // 중략
  await Video.findByIdAndUpdate(id, {
    title,
    description,
    hashtags: Video.formatHashtags(hashtags),
  });
  // 중략
};

4. USER AUTHENTICATION

  • [TIL] 211129

    • 회원가입
    • 로그인
    • 패스워드 해싱 - bcrypt
  • [TIL] 211130 🔥

    • 무상태 / 세션 / 쿠키
    • express-session
  • [TIL] 211201 🔥

    • res.locals
    • connect-mongo (MongoStore)
    • express-session 옵션 - secret / resave / saveUninitialized / store
    • dotenv
  • [TIL] 211202 🔥

    • github 로그인 구현
      • github로 user를 redirect
      • user를 웹 사이트로 다시 redirect
      • access token으로 github API에서 user 정보 가져오기
    • node-fetch - 2.6.1 버전으로 설치
  • [TIL] 211203 🔥

    • github 로그인 규칙 설정
    • 로그아웃

💡 github 로그인 순서

[ startGithubLogin ]

github 로그인 링크 클릭
http:// localhost:7000/users/github/start
https:// github.com/login/oauth/authorize?client_id=...

[ finishGithubLogin ]

user가 앱으로 하여금 github user 정보에 접근할 수 있도록 권한을 승인해줌
http:// localhost:7000/users/github/finish?code=... (redirect)

https:// github.com/login/oauth/access_token?client_id... (fetch 이용)
code를 access token으로 바꿈

https:// api.github.com/user (fetch 이용)
github api에 접근해서 user data와 user email 정보를 가져옴

primary & verified email을 찾음
github email이 DB에 있다면 login 시킴
github email이 DB에 없다면, 그 user의 계정을 생성함

💡 github email이 DB에 없다면, 그 user의 계정을 생성한다

이때 (비록 userSchema에서 password가 필수 값이 아니더라도) User.create({ })에는 password: "" 도 적어줘야 한다.
패스워드를 해싱하는 bcrypt가 password 값을 필요로 하기 때문이다.
이 경우 빈 문자열을 해싱하여 DB에 저장하게 된다.

대신, github 정보를 이용해 계정 생성을 위해 User.create({ })를 실행할 때 password 필드는 아예 쓰지 말고, 패스워드를 해싱하는 pre hook에 if (!this.socialOnly && this.isModified("password"))를 추가할 수도 있다. [TIL] 211226 참고


✨ 내일 할 것

  1. 복습 계속하기 - user profile / upload file
profile
능동적으로 살자, 행복하게😁

0개의 댓글