Express에서 사용되는 여러 미들웨어들은 함수이기 때문에, 개발자가 직접 미들웨어를 만들고 등록할 수 있다.
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
미들웨어 함수는 매개변수로 request, response, next를 받는다. 여기서 next 파라미터에는 다음으로 실행될 미들웨어가 인자로 들어오며, 이를 호출함으로써 미들웨어가 순차적으로 처리된다.
미들웨어를 등록하는 방법은 use()
를 이용하면 된다. 또한 use()
를 사용할 경우, 모든 요청에 대해 미들웨어를 처리하므로, 특정 요청(GET, POST, ...)에만 미들웨어를 호출하고 싶은 경우 get()
이나 post()
등을 사용하면 된다. 마지막으로 위에서는 get()
에서만 url을 지정해 주었는데, use()
에서도 첫번째 인자로 url을 지정해줄 수 있다.
위에서 미들웨어가 순차적으로 처리된다고 언급하였는데, 이는 app.use()
혹은 app.get()
등을 통해 등록한 순서대로 처리가 된다는 것을 의미한다. 즉, 위 예시에서는 myLogger
가 app.get('/'~~)
보다 먼저 등록되었기 때문에, myLogger
가 먼저 처리된 후 app.get('/'~~)
로 차례가 넘어간다.
위에서 잠깐 언급한 순차적인 처리를 예시로 알아보자.
// ...
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
const myLogger2 = function (req, res, next) {
console.log('LOGGED2');
next();
};
app.use(myLogger);
app.use(myLogger2);
// ...
위처럼 두개의 커스텀 미들웨어가 있다면, use()
를 통해 등록한 순서가 myLogger -> myLogger2
이기때문에 LOGGED가 출력된 후, LOGGED2가 출력된다.
// ...
app.use(myLogger2);
app.use(myLogger);
// ...
반대로 위처럼 MyLogger2
가 myLogger
보다 먼저 등록된 경우 LOGGED2가 출력된 후, LOGGED가 출력된다.
위처럼 미들웨어가 순차적으로 실행되기 때문에, 미들웨어의 등록 순서가 중요한 경우가 있다. 다음은 session과 passport 모듈을 등록하는 과정이다.
// session 설정
app.use(session({secret:'asdasd', resave:true, saveUninitialized:true}));
// passport 설정.
app.use(passport.initialize());
app.use(passport.session());
이 예시에서 passport 모듈은 내부적으로 session을 사용하기 때문에, 반드시 passport 미들웨어의 등록 순서가 session 미들웨어의 등록보다 뒤에 존재해야 한다. 만약 반대로 등록할 경우 에러가 발생한다.
미들웨어 함수에서 next를 호출함으로써 다음 미들웨어에게 차례를 넘긴다고 말하였다. 다르게 말하면, next를 호출하지 않음으로써 다음 미들웨어에게 차례를 넘기지 않을 수 있다.
const express = require('express');
const app = express();
const myMiddleWare = function (req, res, next) {
if (parseInt(req.query.id) < 0){
res.send("Error!!");
}
else{
next();
}
};
app.use(myMiddleWare);
app.use(myMiddleWare2); // query string의 id가 0이하면 실행 안됨.
// ...
위처럼 특정 조건에 따라 next를 호출하지 않고 클라이언트에게 응답을 보낸 뒤 함수를 종료하면, 이후의 미들웨어들은 작동하지 않는다.
https://expressjs.com/ko/guide/using-middleware.html
https://expressjs.com/ko/guide/writing-middleware.html