[TIL] NodeJS의 미들웨어 예시

Robin·2022년 7월 29일
0

TIL

목록 보기
12/24
post-custom-banner

NodeJS의 미들웨어 예시

제목의 링크는 참고한 유튜브 영상이다.
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)
  • 위치에 따른 콘솔 확인
    1️⃣ LOG HOME 또는 LOG USERS
    2️⃣ HOME 또는 USERS

next()는 return이 아니다

위에서 살펴본 예시코드에 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()에서의 미들웨어 사용 비교였다.
역시 공식문서에 다 나와있었다! 제발제발 공식문서를 생활화하자😫

profile
Always coding or dog walking
post-custom-banner

0개의 댓글