Middleware
Express.js 동작의 핵심인 미들웨어는 Http 요청과 응답 사이에서 단계별 동작을 수행해주는 함수이다.
middleware의 동작 원리
Express.js의 미들웨어는 HTTP 요청이 들어온 순간부터 시작된다. 미들웨어는 HTTP 요청과 응답 객체를 처리하거나, 다음 미들웨어를 실행할 수 있다.
middleware 작성법
request, response, next를 가진 함수를 구현해서 미들웨어로 동작하게 할 수 있다.
req
: HTTP요청을 처리하는 객체res
: HTTP응답을 처리하는 객체next
: 다음 미들웨어를 실행하는 함수
Router handler와 middleware
Route Handler도 미들웨어 중 하나이다. Route Handler는 라우팅 함수(get, post, put, delete)에 적용된 미들웨어이다. path parameter를 사용할 수 있다.
미들웨어는 적용되는 위치에 따라서 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어로 분류할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
const auth = (req, res, next) => {
if (!isAdmin(req)) {
res.send("not auth");
}
next();
};
app.get("/", (req, res, next) => {
res.send("admin");
});
app.use("/admin", auth, adminRouter);
use
와 http method
를 사용해서 미들웨어를 연결할 수 있다. 미들웨어의 동작이 완료되면 next()
를 통해 다음 동작으로 넘어갈 수 있다.
오류처리 미들웨어
오류 처리 미들웨어는 가장 마지막에 존재하는 미들웨어로 네 가지의 인자를 가지게 된다. err
, req
, res
, next
를 가진다.
1
2
3
4
5
6
7
8
9
10
11
app.use((req, res, next) => {
if (!isAdmin(req)) {
next(new Error("not auth"));
return;
}
next();
});
app.use((err, req, res, next) => {
res.send("err occur");
});
에러가 발생하게 되면 next()
에 에러를 넘기게 되고 오류처리 미들웨어가 바로 실행된다.
함수형 미들웨어
1
2
3
4
5
6
7
8
9
10
11
12
13
const funcMiddleware = (types) => {
return (req, res, next) => {
if (!isCorrect(req, types)) {
next(new Error("error occur"));
return;
}
next();
};
};
app.use("/check", funcMiddleware("type1"), nextRouter);
app.use("/check", funcMiddleware("type2"), type2Router);
위 코드는 미들웨어를 함수형으로 작성한 것이다. funcMiddleware
가 실행될 경우 미들웨어의 동작이 결정되는 방식이다. 로직은 동일하지만 설정 값을 다르게 하고 싶을 경우 사용하게 된다.