지난 시간에 배운 컨트롤러는 서버에서 클라이언트에서 받은 요청에 응답할 때 발동하는 함수를 의미했다. res, req 를 인자로 가진다.
이번 시간에 배울 미들웨어(middleware)는 클라이언트에서 요청을 받았으나 응답하기 이전에 발동하는, 즉 app.get() 과 컨트롤러 함수의 그 사이 어딘가의 기능을 하는 함수를 의미한다. req, res 외에 next 라는 인자를 가진다. 미들웨어의 역할의 관점으로 보았을 때 컨트롤러는 파이널웨어(finalware)쯤 되겠다. (가장 마지막에 응답하니까. 하지만 공식적으로 쓰이는 말인지는 모르겠다.)
미들웨어에 대해 알아보자.
const one = (req,res,next) => {
next();
}
const two = (req,res,next) => {
next();
}
const three = (req,res) => {
console.log("Now three is handling")
}
미들웨어들 생성.
이중 마지막으로 브라우저에게 응답하는 one, two, three 모두 미들웨어이고, 마지막에 응답하는 three 는 미들웨어 중 가장 마지막에 응답하는 파이널웨어, 즉 컨트롤러이다.
const one = (req,res,next) => {
next();
}
const two = (req,res,next) => {
next();
}
const three = (req,res) => {
console.log("Now three is handling")
}
app.get("/login", one, two, three );
하단의 app.get() 으로 /login 페이지로 이동시 one, two, three 가 순차적으로 발동하도록 만들어보았다.
const one = (req,res,next) => {
next();
}
const two = (req,res,next) => {
next();
}
const three = (req,res) => {
console.log("Now three is handling")
}
app.use(one)
app.use(two)
app.get("/login", three)
app.use() 로 쓰인 미들웨어 one, two 는 app 내의 어떤 페이지로 이동해도 발동된다.
반면 app.get() 으로 쓰인 three 는 /login 페이지로 갔을 때만 발동된다.
주의!! app.use() 는 항상 app.get() 보다 상단에 위치해야 한다. 🌟
:자동으로 middleware 를 생성해주는 패키지
약 500줄에 달하는 더 정교하게 움직이는 middleware 를 morgan 패키지 설치하나로 코드 3줄이면 생성할 수 있다.
https://www.npmjs.com/package/morgan
더 자세한 사용법은 여기 참조
https://www.npmjs.com/package/morgan#examples
npm i morgan
import morgan from "morgan" // morgan 패키지 불러오기
const logger = morgan("dev") // morgan 으로 middleware 생성 완료