어려울것없다. '컴퓨터'다.
근데 client와 상호작용(request에 맞게 response를 하는것)
을위해 client가 보내는 request를 항상 listening하고 있는 컴퓨터.
즉 url에 입력해서 request하는것 뿐 아닌 모든 request들이 나(client)를 해당 서버에 데려가는게 아니라.
브라우저가 나(client)를 대신해서 reuqest하고, 서버로부터 받은 response를 나에게 보여주는것이다.
노드를 위한 빠르고, 느슨한, 미니멀리즘 앱 프레임워크다.
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상태가 됫을때 실행시킬 콜백함수 를 받는데.
이후 실행해보면. 서버는 listen상태가 되고 그에따라 cli창에 handleListen함수의 실행결과(console.log)가 나온다.
listen상태가 되어도 각 route마다 response를 return하지 않기때문에,
Cannot Get /Route가 나올거다.
하지만 서버가 꺼진거랑은 다르다. 서버가 켜져있고 listening상태, 응답할 준비가 되었지만 실제로 return하는 response가 없기때문에 나오는 창이다. 꺼져있다면 이렇게 나올것이다.
handler느낌이다.
...
//controller
function handleGetHome(req,res,next){
return res.send('this page is `/`')
}
app.get('/',handleGetHome);
//app.httpmethod (url, ...controllers) => 컨트롤러함수를 여러개받을수 있는걸 알수있다.
//결국 라우트 + 그것을 핸들링하는 함수의 조합이다
'/'로 get request가 오면, Express가 controller함수에 3개의 인자(req,res,next)를 넣어서 줄거다.
handleGetHome가 response를 return하지 않는다면. (ex console.log)
서버로부터 response가 오지 않았으니 client는 response를 받을때까지 계속 request를 보낼거다.
=> 그러니 꼭 resposne를 return해야함
중요한건 하나라도 있어야 client가 계속 request를 보내지 않는다는것.
middle + (soft)ware : 말그대로 중간에 있는 소프트웨어
뭐에 중간에 있다는걸까?
별다른건 아니고 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는
하지만 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()를 해도.}
middleWare를 global하게 쓸수 있게 해줌
기본 틀 : app.use(path,handler) -> path생략시 default는 '/'
middleWare를 쓰려면
app.get('/',handleMiddleWare,handleHome)
이런식으로 써줄텐데. 전~부다 적용되어야 하는 미들웨어가 있다면? 하나씩? No
app.use(globalMiddleWare) // 이런식으로
여러개를 쓰려면 그밑에다가 추가해서 쭉 쓰면된다.
요약하자면 특정한 라우트에다가 특정한 미들웨어를 쓸수도 or 글로벌하게 미들웨어를 쓸수도있다는것.
하지만 이 모든 것들이 app.listen() 전에 코딩되어야 할것이다.
왜? => 서버가 client의 request를 listen했을때의 행동들을 기술하는거니까.
app.use역시 모든 라우트들 전에 적혀야지 모든라우트들이 같은 middleWare를 사용할거다.
app.get('/test',handleTest);
app.use(middleWare)
app.get('/',handle);
// 이렇게되면 '/'라우트는 middleWare를 거치는 반면 '/test'는 거치지 않을것이다.
(global middleWare로 선언되기 전에 짯으니까)