본문 바로가기

Node.js

Node.js로 Restful API Server 만들기(4)

이번글에서는 Express를 사용하면 유용한 MiddleWare들에 대해 소개합니다.

 

MiddleWare는 Node.js Express WebServer에 기능을 추가 하는 모듈입니다. 미들웨어는 HTTP Request와 Reponse주기 사이에서 자동 호출됩니다.

Express 미들웨어 기능은 다음과 같은 다양한 용도로 사용할 수 있습니다.

 

로깅 요청
요청 데이터 파싱(예: JSON 또는 양식 데이터)
사용자 인증
보안 정책 시행(예: CORS)
오류 처리

 

express.json()

express.json()은 Request Body에서 들어오는 JSON 데이터를 구문 분석하고 req.body 개체에서 사용할 수 있도록 g해주는  미들웨어 함수입니다. Express 4.6.10버전부터 내장되어 있어 별다른 패키지 없이 사용합니다. express-generator를 이용해서 템플릿을 생성한 경우 app.js에서 express.json() 미들웨어를 사용하고 있습니다. 

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

// Parse JSON data from incoming requests
app.use(express.json());

// Route handlers
app.post('/users', (req, res) => {
  const { name, email } = req.body;
  // Handle the request body data
  res.send(`User ${name} with email ${email} created`);
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

위와 같이 app.use(express.json()) 한줄을 추가해주면 됩니다. 이전 POST요청 예제에서 req.body를 통해 파라메터를 참조할 수 있던 이유가 express.json() 덕분입니다!

 

express.urlencoded

express.urlencoded는 Request Body에서 들어오는 urlencoded 데이터를 구문 분석하고 req.body 개체에서 사용할 수 있도록 해주는  미들웨어 함수입니다. 이 미들웨어는 구문 분석된 데이터로 req.body 속성을 채웁니다.

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

app.use(express.urlencoded({ extended: false }));

브라우져에서 POST데이터 전송시 urlencoded형식이 많이 사용됩니다. PostMan을 통해 확인해보도록 하겠습니다.

 

기본 indexRouter에 아래 Handler를 추가합니다.

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.post('/urlbody', function(req, res, next) {
  
  console.log(JSON.stringify(req.body));

  res.send(JSON.stringify({
    result : req.body
  }));
});

module.exports = router;

단순히 Body구문을 String으로 변환하여 콘솔에 출력합니다. PostMan에서 아래 그림처럼 설정한후 테스트를 해봅니다.

express.urlencoded를 사용하면 콘솔에 아래와 같이 출력됩니다.

{"key1":"value1","key2":"value2"}

req.body를 통해 key1, key2에 접근할 수있습니다. 이제 app.js에서 아래 코드를 커멘트 처리합니다.

app.use(express.json());
//app.use(express.urlencoded({ extended: true }));

다시 시작해보면 아래와 같이 req.body에 아무것도 출력되지 않습니다!! 만일 JSON구문만 지원한다면 추가하지 않아도 괜찮습니다.

Morgan

Morgan은 Express 애플리케이션에서 HTTP 요청을 로깅하는 데 사용되는 미들웨어입니다. 사용자 정의 가능한 형식으로 들어오는 요청을 콘솔 또는 파일에 기록하는 데 사용할 수 있습니다.

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

// Log incoming requests to the console
app.use(morgan('dev'));

// Route handlers
app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

app.use(morgan('dev')) 추가해 주고 Node.js를 기동합니다. browser에서 접속해보면  아래와 같이 자동으로 Console에 로그를 생성하여 줍니다.

위 예제에서는 morgan의 미리 정의된 형식인 'dev' 를 지정했습니다. 로그를 사용자 지정할 수도 있습니다. 예를 들어 요청 방법, URL, 상태 코드 및 응답 시간을 사용자 지정 형식으로 기록하려면 다음을 수행할 수 있습니다.

logger.token('date', function(req, res, tz) {
  return new Date().toLocaleString();
});

logger.token('access', function(req, res, tz) {
  return req.ip;
});

logger.format('myformat', '[ :date ] :access :method :url :status :response-time ms');

위 예제는 기본 Format대신 접속시간과 Client IP를 추가한 것입니다.  browser에서 접속해보면  아래와 같이 생성하여 줍니다. 이처럼 token을 정의하여 다양한 정보를 출력할 수있습니다.

 

다음장에서 계속됩니다.