본문 바로가기
Back-end

Express.js와 Middleware

by 개미는뚠뚠딴 2020. 11. 22.
반응형

오늘은 Express.js와 Middlewara에 대해서 공부했다.

Express.js는 Node.js 환경에서 웹 어플리케이션 혹은 API를 제작하기 위해 사용되는 인기있는 프레임워크이다.

express framework 는 npm을 통해 다운로드할 수 있다.
express가 기존 http 모듈로 작성했던 서버와 갖는 큰 차이점은, 다음과 같다.

어떠한 라이브러리 없이 순수 node.js 코드로 API를 만든다면 코드는 다음과 같다.

const requestHandler = (req, res) => {
  if(req.url === '/messages') { 
    if (req.method === 'GET') {
      res.end(messages)
    } else if (req.method === 'POST') {
      req.on('data', (req, res) => {
        // do something ...
      })
    }
  }
}

반면 express는 자체 라우터 기능을 제공하므로, 라우터를 활용하면 코드가 매우 직관적으로 변한다.

const router = express.Router()

router.get('/messages', (req, res) =>{
  res.send(messages)
})

router.post('/messages', (req, res) =>{
  // do something
})

코드가 훨씬 짧아진것을 알 수 있다. 

Express.js를 사용할 때 유용한 Middleware가 몇 가지 있는데 이러한 Middleware들은 활용하면 번거로운 작업들을 좀 더 쉽게 해결할 수 있게 된다.

미들웨어를 사용하면 좋은 상황들

  • 모든 요청에 대해 url이나 메소드를 알고자 할 때

미들웨어 작성하는 방법 공식문서 참조

공식문서의 미들웨어 작동 원리 이해

이를 이용하여 모든 요청에 대해서 로그를 찍어보겠다.

const express = require('express');
const app = express();

const myLogger = function (req, res, next) {
    console.log(`LOGGED : method is ${req.method} url is ${req.url}`); // method와 url 로그 생성
    next();
};

app.use(myLogger);

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

app.listen(3000);
// body-parser 미들웨어 사용
const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()

app.post('/api/users', jsonParser, function (req, res) { // 두번째 인자로 넣어주면 json형태로 자동 변환
  // req.body에는 JSON의 형태로 payload가 담겨져 있다.
})

 

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

순수 node.js로 CORS 헤더를 붙이려면, 응답 객체의 writeHead 메소드 등을 이용해 일일이 Access-Control-Allow-* 헤더를 정의해줘야만 하고 OPTIONS 메소드에 대한 라우팅도 구현해줘야 한다.

이를 쉽게 만들어주기 위해 cors 미들웨어를 사용한다.

const cors = require('cors')

app.use(cors()) // 모든 요청에 대해 CORS 허용

// 특정 요청에 대해 CORS 허용
app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

 

  • 요청 헤더에 사용자 인증 정보가 담겨있는지 확인하고 싶을 때
app.use((req, res, next) => {
  // 토큰이 있는지 없는지 확인
  if(req.headers.token){
    req.isLoggedIn = true;
    next()
  } else {
    res.status(400).send('invalid user')
  }
})

이미 로그인한 사용자일 경우 받아주고 아닐 경우 에러를 보내는 미들웨어 예제이다.

반응형

'Back-end' 카테고리의 다른 글

CommonJS  (0) 2020.11.22
CORS란?  (0) 2020.11.19
HTTP  (0) 2020.11.13

댓글