📌 미들웨어
express 프레임워크의 장점 중 하나로 미들웨어를 사용함. 미들웨어란 요청에 대한 응답 과정 사이에서 어떠한 동작을 하는 프로그램. 즉, express는 요청이 들어오면 그에 대한 응답을 보내주는데 클라이언트가 보내는 요청을 받고 응답을 보내주는 과정의 중간(middle)에 개발자가 개입·간섭하여 로직 생성, 요청 및 응답 객체에 대한 변경과 흐름 제어 등을 한다. 현재의 미들웨어 함수가 요청-응답 사이클을 종료하지 않는 경우에는 next()를 호출하여 그다음 미들웨어 함수에 제어를 전달해야 한다. 만약 next()를 호출하지 않았을 경우 해당 요청이 정지된 채로 미들웨어에 머무르게 된다.
📌 미들웨어 함수 호출의 요소
다음 이미지는 미들웨어 함수 호출의 요소가 표시된 예제이다.
app.use()에서 사용되는 모든 함수들은 미들웨어이며, 요청이 올 때마다 미들웨어를 거치고 클라이언트로 응답한다.
app.use(morgan("dev"));
app.use(express.static(__dirname + "/public"));
app.use("/uploads", express.static("uploads"));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use("/", (req, res, next) => {
console.log("root");
next();
});
app.get("/", (req, res) => {
res.status(200).sendFile(__dirname + "/views/block.html");
});
app.use("/api/employee", EmployeeRoute);
내부적으로 각 미들웨어 함수는 next라는 파라미터를 받아 함수 실행이 끝나면 next()를 호출해 다음 미들웨어 함수로 현재 요청을 넘길 수 있다.
📌 미들웨어 특징
- 모든 코드를 실행
- 다음 미들웨어를 호출
- 요청 및 응답 오브젝트에 대한 변경을 실행
- 요청-응답 주기를 종료
1. 모든 코드를 실행
미들웨어 함수 내부 로직을 실행한다.
2. 다음 미들웨어를 호출
다음 미들웨어 호출의 예시를 코드를 통해 알아보자.
const test = (req, res, next) => {
console.log("root");
next();
}
app.use("/", test);
app.get("/", (req, res) => {
res.status(200).sendFile(__dirname + "/views/block.html");
});
웹 브라우저에서 http://localhost:3000/ 주소로 요청을 보내면 use() 함수에 등록한 test 미들웨어 함수를 먼저 실행하고
next()를 호출하여 동일한 root 경로("/")의 미들웨어 함수에 제어를 전달한다.
3. 요청(req) 및 응답(res) 오브젝트에 대한 변경을 실행
아래의 코드는 req, res 객체에 대한 변경 실행 예시 코드다.
app.use("/", (req, res, next) => {
req.test = "test";
next();
});
app.get("/", (req, res) => {
console.log("test", req.test);
res.status(200).sendFile(__dirname + "/views/block.html");
});
use()에 선언한 미들웨어 함수에서 req객체에 test라는 프로퍼티를 추가하고 next()를 호출하면 다음 미들웨어에서 req 객체에 정의한 test 프로퍼티 값을 사용할 수 있다. 아래의 이미지를 통해 이전 미들웨어 함수의 req객체에 정의한 test 프로퍼티 값을 후속 미들웨어 함수에서도 사용가능 하다는 것을 알 수 있다.
4. 요청-응답 주기를 종료
아래의 예시 코드는 POST method 요청을 보내면 클라이언트로 응답을 전송하며, 그 이외의 method 요청에 대해서는 후속 미들웨어로 제어를 전달한다.
app.use("/", (req, res, next) => {
if (req.method === "POST") res.send("req.moethod === POST");
next();
});
app.get("/", (req, res) => {
res.status(200).sendFile(__dirname + "/views/block.html");
});
참고 링크
https://expressjs.com/ko/guide/writing-middleware.html
'Programming > Node.js' 카테고리의 다른 글
[Node.js] Express body-parser 너 뭐냐? (0) | 2021.10.13 |
---|---|
[MongoDB] mongoose.connection.on() & once() (0) | 2021.10.13 |
Node.js 교과서 express 미들웨어 (0) | 2020.11.27 |
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part2 (0) | 2020.09.17 |
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part1 (0) | 2020.09.11 |