Express 미들웨어란?
개념
미들웨어는 서로 다른 어플리케이션이 서로 통신하는데 사용되는 소프트웨어이다. 즉, 양쪽을 연결하여 데이터를 주고받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어이다.
미들웨어에는 순서이 있는데, 코드의 상단에 있는 것이 먼저 실행되고 하단에 있을 수록 나중에 실행된다.
주로 하단의 미들웨어의 경우 위쪽 코드에서 next를 쓰느냐에 따라 실행이 될 수 있다.
미들웨어의 종류
- Application Level
- Router Level
- Error 처리
- 기본 제공
- Thirdparty 미들웨어
1. Application Level Middleware
주로 app객체의 app.use()나 app.METHOD( app.get, app.post) 함수를 이용해서, 미들웨어를 app 인스턴스에
바인딩하는 미들웨어이다. 경로가 없는 미들웨어 함수는 수신할 때 마다 실행하게 된다.
//경로가 있rh, 다음 미들웨어 함수를 호출함
app.get('/pages/', (req, res, next) => {
console.log('Time : ', Date.now());
next();
});
//경로가 없고, 응답을 여기서 끝냄
app.get((req, res, next) => {
console.log('Not Found');
});
2. Router Level Middleware
express.Router()로 생성할 수 있는 router 인스턴스에 미들웨어가 바인딩되는 것이다. 이외에는
어플리케이션 레벨 미들웨어와 차이가 없다.
router.user() 또는 router.METHOD() 함수를 이용해서 로드할 수 있다.
app.js에 app.use을 통해 등록.
//app.js
const express = require('express');
const app = express();
const pageRouter = ('./routes/pages');
app.use('/pages', pageRouter);
page.js로 가면 router 미들웨어가 있다.
//pages.js
const express = require('express');
const router = express.Router();
router.get('/pages/:id', (req, res, next) => {
//pages id가 0이면 'regular'가 아닌 'special'로 넘어감
if (req.params.id == 0) next('route');
//pages id가 0이 아니라면 'regular'로 넘어감
else next();
}, (req, res, next) => {
res.send('regular');
}
});
//pages id가 0일 때 넘어올 미들웨어
router.get('/pages/:id', (req, res, next) => {
res.send('special');
}
module.exports = router;
next의 용도도 알 수 있다.
3. Error 처리 middleware
에러 처리 미들웨어는 (err, req, res, next)를 인자로 받는다. 항상 4개의 매개변수가 필요하다.
//오류의 종류에 상관없이 모든 오류를 잡는 미들웨어
app.get((err, req, res, next) => {
console.log(err.stack);
res.status(500).send('Something broke!');
});
이 경우는 모든 오류를 잡는 미들웨어 하나이다.
에러마다 다른 에러처리 미들웨어 함수를 정의 할 수 있다. 그래서 catch-all 에러 처리 함수는 오류 처리 미들웨어들 중에서 가장 아래에 있어야한다.
app.get('/pages/:id', (req, res, next) => {
if (!req.params.id) next(err);
});
// next를 써서 다음 에러 처리 미들웨어로 넘어간다.
4. 기본 제공 미들웨어
express.static 같은 것이다.
app.use(express.static(__dirname + '/public'));
5. Third party 미들웨어
써드파티 미들웨어는 npm에서 설치한 모듈들이 해당이 된다. 즉 따로 설치해야하는 것들이다.
ex) cookie-parser
설치: npm i cookie-parser
const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');
app.use(cookieParser());