본문 바로가기
Node.js

[Node.js] 노드제이에스 - 미들웨어 함수 만들기

by Seong-Jun 2024. 2. 8.
728x90
반응형
SMALL

Do it! Node.js 프로그래밍 입문 공부단 6일차 입니다.

 

next로 미들웨어 연결하기

미들웨어 함수 특성

  1. 미들웨어 함수는 요청객체나 응답객체를 변경하고 종료할 수 있습니다.
  2. 함수를 처리할 때 함수 안에서 응답이 종료되지 않고 그 결과를 다음 함수로 넘겨야 할 경우도 많습니다. 이때 next함수를 사용해서 다음 미들웨어 함수로 연결합니다.
const requestTime = (req, res, next) => {
    // ...
    next()
}
app.use(requestTime)

app.get("/", (req, res) => {
    res.status(200).send("Hello Node - 07")
})
requestTime이라는 미들웨어 함수는 응답을 종료하지 않고 다음 미들웨어로 연결하기 위해 함수 안에 next() 포함하고 있습니다. next()는 현재 미들웨어의 바로 다음 미들웨어로 연결합니다. 위 코드에서는 app.get()으로 연결됩니다.

그래서 미들웨어는 코드에서 작성된 순서가 중요합니다.

 

코드

app.js

const express = require("express")
const app = express()
const port = 3000

// logger 미들웨어 선언
const logger = (req, res, next) => {
    console.log("User Logged")
    next()
}
app.use(logger)
app.route("/").get((req, res) => {
    res.status(200).send("Hello Node - 07")
})

app.use("/contacts", require("./routes/contactRoutes")) // router 등록

app.listen(port, () => {
    console.log(`${port} - start server`)
})

 

처음 서버를 시작하고 /경로로 이동했을 때 서버가 재실행되면서 위와 같은 결과가 나옵니다. 이제 app.use(logger) 코드의 위치를 app.use("/contacts", ...) 앞으로 변경하겠습니다. 즉, logger 미들웨어 다음에 연결되는 미들웨어를 변경한 것입니다.

 

결과는 /경로로 이동했을 때 User Logged가 출력되지 않고 /contacts 경로로 이동했을 때 User Logged가 출력됩니다.

 

응답을 종료하지 않는 미들웨어 함수를 작성할 때는 next 매개변수를 가져야 하고, 함수 코드 마지막에 next()를 추가해서 다음에 실행할 미들웨어와 연결해야 한다는 점을 기억해야합니다. 그리고 미들웨어는 순서대로 적용되므로 코드에서 미들웨어의 순서를 잘 지켜야 합니다.

 

요청 객체나 응답 객체 변경하기

app.js

const express = require("express")
const app = express()
const port = 3000

const requestTime = (req, res, next) => {
    let today = new Date()
    let now = today.toLocaleTimeString() // 현재 시간을 문자열로 변환
    req.requestTime = now // req 객체에 requestTime 속성 추가
    next()
}
app.use(requestTime) // requestTime 미들웨어 사용

app.get("/", (req, res) => {
    const responseText = `Hello Node - 07\n요청시간: ${req.requestTime}`
    res.set("Content-Type", "text/plain")
    // Content-Type 헤더를 지정하지 않을 경우
    // HTML로 간주하기 때문에 텍스트형식으로 인식할 수 있도록 설정해야함
    
    res.send(responseText)
})

app.use(express.json())
app.use(express.urlencoded({extended: true}))

app.use("/contacts", require("./routes/contactRoutes"))

app.listen(port, () => {
    console.log(`${port} - start server`)
})

 

728x90
반응형
LIST

댓글