제목의 링크는 참고한 유튜브 영상이다.
Express 공식문서에도 비슷한 예시를 찾아볼 수 있으니 확인해보면 좋다.
const express = require("express")
const app = express()
app.use(logger) // 1️⃣ 글로벌 미들웨어로 어느 페이지를 가더라도 작동하게 된다
app.get("/", (req, res) => {
console.log("HOME")
res.send("HOME PAGE")
}
app.get("/users", (req, res) => {
console.log("USERS")
res.send("USERS PAGE")
}
app.use(logger) // 2️⃣ 이 위치에 있게 되면 app.get()들에서 next()를 하지 않았기 때문에 콘솔에 찍히지 않는다.
function logger(req, res, next) {
console.log("LOG")
next()
}
app.listen(3000)
LOG HOME
또는 LOG USERS
HOME
또는 USERS
위에서 살펴본 예시코드에 auth
라는 미들웨어를 추가하여 next()에 대해 알아보자.
const express = require("express")
const app = express()
app.use(logger)
app.get("/", (req, res) => {
console.log("HOME")
res.send("HOME PAGE")
}
app.get("/users", auth, (req, res) => {
console.log("USERS")
res.send("USERS PAGE")
}
function logger(req, res, next) {
console.log("LOG")
next()
}
function auth(req, res, next) {
if(req.query.admin === "true") {
req.admin = true
next()
return // ⭐️반드시 리턴을 해준다⭐️
}
res.send("No auth")
}
app.listen(3000)
만약 return이 없다면 next()를 통해 다음 코드를 실행한 후 다시금 auth로 돌아와 res.send("No auth")
라인을 실행하게 된다.
이해를 돕기 위해 더 쉬운 예시코드를 들자면:
app.use(logger)
app.get("/users", (req, res) => {
console.log("USERS")
res.send("USERS PAGE")
}
function logger(req, res, next) {
console.log("BEFORE") //✅
next()
console.log("AFTER")
}
👉 콘솔창에는 BEFORE USERS AFTER
순으로 찍히게 된다.
만약 ✅ 표시된 라인이 존재하지 않는다면 USERS AFTER
순으로 찍히게 되는 것이다.
이외에도, next()의 ()
내부에 인자를 넣어서 정보를 전달하지 않는다. 대신 req나 res안에 정보를 넣어 전달한다. 위의 코드의 경우, req.admin
을 통해 정보를 전달하고 있다.
...또한 루트 경로 라우트의 콜백 함수는 미들웨어 함수가 req(요청 오브젝트)에 추가하는 특성을 사용합니다. (공식문서 발췌)
가장 궁금했던 점은 app.METHOD()
와 app.use()
에서의 미들웨어 사용 비교였다.
역시 공식문서에 다 나와있었다! 제발제발 공식문서를 생활화하자😫