본문 바로가기
코드스테이츠

2/7 일일정리 Express서버, MiddleWare

by 강물둘기 2023. 2. 7.

Express

Express는 Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 프레임워크이다.

Express는 RouterMiddleware를 제공한다.

 

Router

라우팅은 URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것을 말합니다. - Express 공식문서

 

Express 라우터는 다음과 같은 코드로 작성한다.

app.METHOD(PATH, HANDLER)

METHOD에 자신이 원하는 method(GET,POST 등)를 설정하고, method에 따라 다른 경로(PATH)를 설정한다.

그리고 라우트가 일치할 때 HANDLER 함수를 호출한다.

 

라우트 사용 예시 

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.put('/user', function (req, res) {
  res.send('Got a PUT request at /user');
});

 

MiddleWare

 

MiddleWare란 request를 받은후 response를 보내기전에 중간중간에 거쳐가는 함수를 말한다.

필요한 기능을 더하거나 불필요한 부분을 빼는 등의 역할을 수행한다.

Express에서 서버를 구축할 때 MiddleWare는 다음과 같은 상황에서 주로 사용한다.

⓵ request에 포함된 body(payload)를 구조화 할 때

⓶ 모든 요청/응답에 CORS 헤더를 붙여야 할 때

⓷ 모든 요청에 대해 url이나 메서드를 확인할 때

⓸ 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

 

⓵ Body 구조화

 Express에 내장된 json 메서드를 사용하면 request body를 쉽게 빼내올 수 있다.

const jsonParser = express.json();

// 생략
app.post('/api/users', jsonParser, function (req, res) {

})

 

⓶ 모든 요청/응답에 CORS 헤더를 붙일 때

cors middleware를 사용하면 모든 요청에 CORS헤더를 붙일 수 있다. 

const cors = require('cors');

// 생략
app.use(cors());

 

헤더 세부내용을 수정하고 싶으면   cors 함수에 인자를 전달한다.

특정 요청에만 CORS 헤더를 붙이고 싶으면  use가 아닌 특정 메서드에 인자로 cors함수를 전달한다.

const cors = require('cors');
const corsOptions = {
  origin: 'http://example.com',
  optionsSuccessStatus: 200
}

app.use(cors(corsOptions));

// OR
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for only example.com.'})
})

 

⓷ 모든 요청에 대해 url이나 메서드를 확인할 때

위와 같이 새로운 MiddleWare 함수를 만들고 인수로 받은 request의 method와 url을 콘솔로 출력할 수도 있다.

중요한 것은 세번째 인자인 next 함수를 사용하지 않으면 다음 middleware 단계로 넘어가지 않기 때문에 꼭 사용해야 한다.

 

⓸ 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

HTTP 요청에서 토큰이 있는지를 판단하여, 이미 로그인한 사용자일 경우 성공, 아닐 경우 에러를 보내는 예제이다.

app.use((req, res, next) => {
  if(req.headers.token){
    req.isLoggedIn = true;
    next();
  } else {
    res.status(400).send('invalid user')
  }
})

 

 

Express server 실습

페어와 함께 어제 node.js의 http 모듈로 만들어본 서버를 Express로 리펙터링 해보았다.

복잡하게 받던 request body는 .json 함수를 사용하여 편하게 받을 수 있었고,

직접 객체로 만들어서 전달하던 CORS 헤더는 cors모듈을 사용하여 편하게 작성했다.

* cors 함수에 옵션을 전달해서 기존에 204 상태코드가 나오던 것을 200으로 바꾸어보았다.(post메서드는 201)

댓글