Express + NodeJs

길고 꾸준하게·2022년 5월 10일
0

Node.js퍼먹기

목록 보기
2/5
post-thumbnail

1. What is Server

어려울것없다. '컴퓨터'다.
근데 client와 상호작용(request에 맞게 response를 하는것)
을위해 client가 보내는 request를 항상 listening하고 있는 컴퓨터.

즉 url에 입력해서 request하는것 뿐 아닌 모든 request들이 나(client)를 해당 서버에 데려가는게 아니라.
브라우저가 나(client)를 대신해서 reuqest하고, 서버로부터 받은 response를 나에게 보여주는것이다.

2. Express

노드를 위한 빠르고, 느슨한, 미니멀리즘 앱 프레임워크다.

2-1. Create express application & listening

import express from 'express'
//babel을 이용해서 es6모듈을 사용가능. 아니라면 아래처럼
const express = require('express')

const app = express();
//Express application을 생성해준다.

express application을 생성했으면 client의 request를 listening하는 상태가 되어야 할꺼다.

...
const port = 4000;

function handleListen(){
	console.log(----- Server listening on port http://localhost:${PORT} -----)
}
app.listen(port,handleListen)

listen메서드는 1번째인자로 port, 2번째인자로 listen상태가 됫을때 실행시킬 콜백함수 를 받는데.

  • port는 관습적으로 4000번을 많이쓴다고한다. 이유는 왠만해서 비어있는 포트가4000번 이라고 한다.

이후 실행해보면. 서버는 listen상태가 되고 그에따라 cli창에 handleListen함수의 실행결과(console.log)가 나온다.

2-2. route에 따른 response

listen상태가 되어도 각 route마다 response를 return하지 않기때문에,
Cannot Get /Route가 나올거다.

하지만 서버가 꺼진거랑은 다르다. 서버가 켜져있고 listening상태, 응답할 준비가 되었지만 실제로 return하는 response가 없기때문에 나오는 창이다. 꺼져있다면 이렇게 나올것이다.

2-3. controller

handler느낌이다.

...
//controller
function handleGetHome(req,res,next){
	return res.send('this page is `/`')
}

app.get('/',handleGetHome);

//app.httpmethod (url, ...controllers) => 컨트롤러함수를 여러개받을수 있는걸 알수있다.

//결국 라우트 + 그것을 핸들링하는 함수의 조합이다
  • express()를 이용해 app이라는 변수에 express application을 생성했다.
  • http method(get) + route(app.get('/')) + controller(handleGetHome)

'/'로 get request가 오면, Express가 controller함수에 3개의 인자(req,res,next)를 넣어서 줄거다.

  • req = request에 대한 정보 (물론 req의 이름은 맘대로지만 넘겨오는 순서는 정해져있다)
  • res = response에 대한 정보(다양한 메서드를 이용해 response해줄수 있다)
  • next = 다음 컨트롤러함수를 실행시킴 //middle ware부분에서 설명

handleGetHome가 response를 return하지 않는다면. (ex console.log)
서버로부터 response가 오지 않았으니 client는 response를 받을때까지 계속 request를 보낼거다.
=> 그러니 꼭 resposne를 return해야함

2-3-1 response

  • res.send(string,html,obj(json)) : 말그대로 인자에 담긴 data를 보내준다
  • res.end() : 뭘 보내지는 않고 그냥 종료해버린다 (깡통의 response를 해주는 느낌)
    .. 이외에도 많다 -> 공식문서

중요한건 하나라도 있어야 client가 계속 request를 보내지 않는다는것.

2-4. middle ware

middle + (soft)ware : 말그대로 중간에 있는 소프트웨어

뭐에 중간에 있다는걸까?

  • request를 받아 response를 할때 그 중간에 이 미들웨어를 거친다. (있다면)

별다른건 아니고 middle ware역시 handler다 하지만 response는 하지않는.

function handleMiddleWare(req,res,next){
	console.log('im middle ware')
    next();
    /*
    다음 controller인 handleHome 실행시켜줌 하지만 이역시 다음 controller가
    response를 return하지 않는다면 client는 계속 request를 보낼거다(res받을때까지)
    */
}

function handleHome(req,res,next){
	return res.send('im handleHome')
}

app.get('/',handleMiddleWare,handleHome)

controller는 실직적으로 res 해주는 녀석이라고 일단 이해했다 (middleware와 차이를좀 두려고)

보면 알겠지만 결국 middleWare는

  • response를 return하지 않으면서 (= request를 지속시킨다는 의미)
  • next()가 있어야 하는 녀석
    (next()를 썻지만 다음컨트롤러 함수가 인자에 들어가있지 않는다면
    아예 접속자체가 안되서 cannot get /url이 나올거다.)

하지만 middleWare단계에서 response를 return해버리면 서버의 역할은 다했기때문에 그 다음 handler로 안넘어갈것이다.

function privateMiddleWare(req,res,next){
	const url = req.url;
    if(url === '/private') return res.send('not Aloowed get out!')
    else next();
}
app.use(privateMiddleWare)

/private로 request를 보내면 response시 미들웨어를 거칠거고. if문에 걸리니 middleWare가 response를 return하니까 미들웨어단계에서 다음으로 안넘어갈것이다.
{아무리 다음 컨트롤러가 있고, next()를 해도.}

2-4-1. app.use()

middleWare를 global하게 쓸수 있게 해줌
기본 틀 : app.use(path,handler) -> path생략시 default는 '/'

middleWare를 쓰려면

app.get('/',handleMiddleWare,handleHome)

이런식으로 써줄텐데. 전~부다 적용되어야 하는 미들웨어가 있다면? 하나씩? No

app.use(globalMiddleWare) // 이런식으로

여러개를 쓰려면 그밑에다가 추가해서 쭉 쓰면된다.

요약하자면 특정한 라우트에다가 특정한 미들웨어를 쓸수도 or 글로벌하게 미들웨어를 쓸수도있다는것.

2-5. 순서

하지만 이 모든 것들이 app.listen() 전에 코딩되어야 할것이다.
왜? => 서버가 client의 request를 listen했을때의 행동들을 기술하는거니까.

app.use역시 모든 라우트들 전에 적혀야지 모든라우트들이 같은 middleWare를 사용할거다.

app.get('/test',handleTest);
app.use(middleWare)
app.get('/',handle);

// 이렇게되면 '/'라우트는 middleWare를 거치는 반면 '/test'는 거치지 않을것이다.
(global middleWare로 선언되기 전에 짯으니까)

뭔가 길고 주저리주저리 느낌인데.. 명확하게 정리했다고 생각한다 주말에 또 슥 봐야겠다.

profile
작은 나의 개발 일기장

0개의 댓글