Nodejs – 유용한 미들웨어 :^)

유용한 내부 미들웨어 👏

import express from 'express';

const app = express();

// express.json -> REST API, body parse
// express.urlencoded -> HTML form
// express.static

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

app.post('/posts', (req, res) => {
  console.log(req.body);
  res.status(201).send('Thanks, Created');
});

app.listen(8080);
  • express.json()
    • REST API, body를 간단하게 파싱할때 사용
  • express.urlencoded({extended: false})
    • body를 파싱할때 사용. HTM에서 Form이라는 UI요소에서 submit 하게되면 request가 자동으로 발생하는데, 그 때 전달된 html에서 만든 데이터를 body 안으로 파싱해준다.
  • express.static()
/* express.static() 모듈없이 정적인 public 파일을 클라이언트에게 res로 보내줄 때 */

import express from 'express';
import fs from 'fs';
import path from 'path';

const __dirname = path.resolve();
const app = express();

app.use('/',(req,res,next)=>{
  res.sendFile(__dirname + '/public/image.png');
});


/* express.static() 모듈 사용하여 정적 파일 제공  */

const options = {
  dotfiles: 'ignore',
  etag: false,
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  },
};

app.use(express.static('public', options)); // public 경로 안에 있는 파일들을 클라이언트가 모두 읽어갈 수 있도록 설정해둘 수 있음
// localhost:8080/image.png
// localhost:8080/index.html

app.listen(8080);

원래 파일을 보내주려면, 각 경로별로 sendFile(‘파일 경로’)을 보내주어야하지만 express.static() 미들웨어를 이용하여 클라이언트가 읽어갈 수 있도록 등록해둘 수 있다. 이 때 클라이언트의 접근경로는 localhost:8080/image.png, localhost:8080/index.html 와 같이 등록한 public 경로를 빼고 바로 접근한다.

  • 참고 : https://expressjs.com/ko/4x/api.html#express

유용한 외부 미들웨어 👏

  • cookie-parser
    • 기본적으로 request 안의 cookies는 ‘undefined’ 이다.
    • app.use(express.json()) 호출없이 req.body 를 보면 ‘undefined’ 으로 나오는 것처럼, req.cookies 도 기본적으로는 ‘undefined’ 이지만, cookieParser 미들웨어를 등록하면 편하게 사용할 수 있다.
import express from 'express';
import cookieParser from 'cookie-parser';

const app = express();
app.use(express.json());
app.use(cookieParser()); //http://expressjs.com/en/resources/middleware/cookie-parser.html

app.get('/', (req, res) => {
  console.log(req.cookie) // undefined >> {}
  res.send('Welcome!');
});

app.listen(8080);

  • morgan
    • 사용자에게 요청을 받을때마다 어떤 요청을 받았는지, 얼마나 걸렸는지에 대한 정보를 로그로 편하게 남기고 싶다면, 이 미들웨어를 사용하는 것이 좋다. 일일이 경로/요청마다 로깅처리 해주는 것은 아주 미련한….짓…💀
    • apache 표준에 따라 로깅 레벨을 나눌 수 있다.
      • app.use(morgan(‘combined’))
      • app.use(morgan(‘common’))
      • app.use(morgan(‘dev’))
import express from 'express';
import morgan from 'morgan';

const app = express();
app.use(morgan('common')); // http://expressjs.com/en/resources/middleware/morgan.html

app.get('/', (req, res) => {
  console.log(req.cookies); // it will be undefined without cookie-parser
  console.log(req.cookies.yummy_cookie);
  res.send('Welcome!');
});

app.listen(8080);

  • helmet
    • cors 에서 보안에 필요한 헤더들을 등록하긴 하지만, 보안을 위해 추가로 헤더에 추가할 정보들이 있을 수 있다.
    • helmet은 추가적으로 보안에 필요한 정보들을 헤더에 추가해준다.
      • xss 필터링
      • 스니핑
import express from 'express';
import cors from 'cors';

const app = express();

const corsOptions = {
  origin: ['http://localhost:3000'],
  optionsSuccessStatus: 200, // for options request
  credentials: true, // Access-Control-Allow-Credentials: true
};

app.use(cors(corsOptions));
app.use(helmet()); // https://github.com/helmetjs/helmet