3일차

해피데빙·2022년 9월 5일
0

vue

목록 보기
4/9

server.ts

  • cluster
  • config
  • connect-redis
  • cookie-parser
  • cors
  • express
  • express-handlebars
  • serve-favicon
  • fs
  • https
  • middleware
  • morgan
  • os
  • path
  • express-session
  • routers

Cluster

  • redis에서 돌아가고 있는 CPU가 여러 개이므로 이를 최대한 활용하기 위해서 사용
  • 만약 master cpu가 맞다면 cpu가 몇개인지 세서 나머지 cpu들에 fork를 한다

Connect-redis

connect-redis provides Redis session storage for Express
유저가 로그인할 때 해당 정보가 db에 있다면 token(랜덤 string)을 생성해서 redis에 저장한다. 유저가 이후 요청을 할 때마다 해당 token을 보내고 이를 확인해서 redis가 가지고 있는 랜덤 스트링과 일치하면 유저의 정보를 보내준다.

handlebar

  • 알아서 만든 문법대로 돌아간다
  • express-handlebars.create로 만들어서 사용

Express

  • const app = express();
  • app.engine("handlebars", hbs.engine) //handlebar 연결
  1. express.json vs express.urlencoded
    http 요청 메시지 형식에서 body 데이터를 해석하기 위해 필요
  • express.urlencoded({extended: true/false})
    옵션1)extended: false - NodeJs에 기본으로 내장된 querystring모듈을 사용합니다.
    옵션2)extended: true - 추가로 설치가 필요한 qs모듈을 사용(express에 포함되어 자동설치)

    이렇게 원하는 형태의 string에 접근하려면 true로 해주는 것이 좋다

  • express.json()

  • 정리

    둘 다 쓸 거면 둘 다 app.use 안에 사용하면 됨

cf. 둘은 모두 bodyparser 사용

  1. express-session

cookie : 쿠키는 웹 브라우저에 저장되는 '키-밸류' 타입의 데이터
express-session : 쿠키와 달리 서버에 데이터를 저장하고 웹 브라우저는 Session ID만을 가지고 있기 때문에 비교적 안전합니다

  • express-session 이 만들어준 key 가 겹칠 확률은 0에 수렴한다.
  • 만약 일정 시간이후에 자동으로 로그아웃 되게끔 하고 싶다면,시간만 정해주면 된다

과정

  1. 서버는 웹 브라우저에게 세션 값을 보내줍니다. (sid 라고 하며, 아무런 의미도 없는 단순 식별자입니다.)
  2. 클라이언트는 접속할 때 자신이 가지고 있는 sid를 서버에게 전달합니다.
  3. 서버는 클라이언트가 보내준 sid를 가지고, 해당 유저를 식별합니다.

express-session만을 가지고는 여러 사용자에게 세션이라는 기능을 제공할 수 없습니다. 저장소를 사용하지 않기 때문.

express-session로 만든 session은 아래와 같은 곳에 저장될 수 있다

  1. 파일에 저장
  2. DB에 저장
  3. Memory 에 저장

ex. redis에 저장. connectRedis 라이브러리를 통해 redis의 주소만 전달해주면 그 곳에 세션을 저장할 수 있다

morgan

  • nodejs에서 사용되는 로그 관리를 위한 미들웨어
  • 로그 관리 쉽게 가능
  • 토큰 등 간편하고 유용한 기능
  • 로그 관리 커스텀 가능

cookieParser

  • 요청된 쿠키를 쉽게 추출할 수 있도록 해주는 미들웨어
  • request 객체에 cookies 속성 부여
app.use(cookieParser());
app.get('/', function(req,res){
	console.log(req.cookies)
})

app.listen(8080) 

middleware

  • express같은 경우 app.use를 통해 라우팅 전에 미리 세팅할 수 있다
  • reqPropertyHandler같은 함수를 써서 요청에 대해 세팅을 해줄 수 있다
    : user에 대한 정보(ex. id, ip, useragent 등등을 구해서 다른 파일에서 언제든지 사용할 수 있도록 추가한다)
  • resPropertyHandler : handlerbar 함수랑 함께 쓸 거니까 해당 파일들과 연결해주기 위해? 쓴다
  • fingerprinter, checkHttpBan : 문제 있는 ip들 접속 밴
  • app.use(routeHandler) : 해당 route가 없으면 error 던지는 요

cf. _. : 비동기 함수

Routers

  • 서브도메인Id 확인
    : 접속하는 사용자의 학교에 따라 다른 화면을 보여줘야 하니까
    : subdomain, campusIdentifiers와 비교해서 일치파면 첫번째, 없으면 0
    : 확인 후 해당 학교의 데이터를 가져오고 사용자의 학교 관련 데이터 (학번 등)을 가져온다
    : 이를 이용해 학교의 정보가 담긴 곳으로 간다

해당하는 힉번이 없으면 학번이 틀린 거고 학번이 있는데 캠퍼스가 없으면 학교가 틀린 것
이렇게 확인하는 절차 필요
이럴 때는 에브리타임 메인 화면으로 리다이렉트

  • routers 중에 js/ts(js : 옛날, ts: 최근) : 둘다 혼용하기 위해 사용

lectureRouter

page파일로 가기 전에 router파일에서 데이터를 모두 받아온다
Entity 폴더에서 각각의 데이터가 필요한 타입을 받아온다

  • router = Router()
  • router.all(["/lecture/view/강의번호", "/lecture/view/subject/과목번호"], 로그인 상태 확인 함수, 비동기 함수 사용하기 위한 함수(req, res) => {
 현재 사용자의 데이터, 
  params로 받은 데이터 등등 
  사용하려고 하는 정보들을 변수로 만들어서 사용하기 편하게 한다 
  
  auth를 거쳐서 currentUser의 상태가 업데이트되도록 한다

}

cf. db에서 데이터 가져오는 방법

const timetablePool = mysql.createPool({
database 관련 정보들, rds처럼 aws에 띄운 데이터베이스 주소, 비밀번호 포트, 사용자 등을 config.get으로 가져와서 푼다
})해서 안에서 구한다 
const [rows] = await timetablePool.query<Row[]>({sql:query})

해당 쿼리문의 조건을 모두 만족하는 데이터를 가져온다
이때 <Row[]>는 강의, 과목, 인기 강의 각각의 인터페이스로, 더 구체적인 내용들의 타입을 지정한다

profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17

0개의 댓글