유용한 내부 미들웨어 👏
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