요청과 응답의 중간에 위치하여 미들웨어라고 부릅니다.
미들웨어는 요청과 응답을 조작하여 기능을 추가하기도, 나쁜 요청을 걸러내기도 합니다.
Express 내에서 요청과 응답에 대한 정보를 사용해서 필요한 처리를 진행 할 수 있도록 분리된 독립적인 함수입니다.
그리고 각각 미들웨어는 next() 메소드를 호출해서 그 다음 미들웨어가 작업을 처리할 수 있도록 순서를 넘길 수 있습니다.
위에서 function(req, res, next) 부분이 바로 미들웨어입니다.
const requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
위에 코드는 requestTime 미들웨어 함수입니다. 또한 루트 경로 라우트의 콜백함수는 미들웨어 함수가 req에 추가하는 특성을 사용합니다.
const express = require('express');
const app = express();
const requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
app.use(requestTime);
app.get('/', function (req, res) {
const responseText = 'Hello World!';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
이제 앱의 루트에 대한 요청을 실행할 때, 앱은 이제 요청의 타임스탬프를 브라우저에 표시하게 됩니다.
app.use()는 Express 앱에서 항상 실행하는 미들웨어 역할입니다.
get이나 post 와 달리 요청 URL을 지정하지 않아도 app.use()를 사용할 수 있으며 해당 경우에는 URL에 상관없이 매번 실행됩니다.
미들웨어는 첫번째 인수로 주소를 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소(URL)을 넣는다면 해당하는 요청에서만 실행됩니다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false
},
name: 'session-cookie'
}));
app.use((req, res, next) => {
console.log('모든 요청에 다 실행됩니다.');
next();
})
app.get('/', (req, res, next) => {
console.log('GET / 요청에서만 실행됩니다.');
next();
}, (req, res) => {
throw new Error('에러는 에러 처리 미들웨어로 갑니다.');
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
})
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중.');
});
https://medium.com/@seymarslan/what-ismiddleware-fdb2ad163388
https://expressjs.com/ko/guide/writing-middleware.html
https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4-%F0%9F%92%AF-%EC%9D%B4%ED%95%B4-%EC%A0%95%EB%A6%AC