Yunseok's Dev Blog

배운 것을 적는 블로그입니다.

Express Writing middleware

Overview

  • 미들웨어함수는 어플리케이션의 request-response사이클에서 req(request 객체), res(response 객체) 그리고 next함수에 접근하는 함수를 말합니다.
  • next함수는 Express 라우터의 함수로, 호출 될 때 현재 미들웨어를 계승하는 미들웨어를 실행합니다.
  • 미들웨어는
    • 어떤 코드든 실행할 수 있습니다.
    • request객체와 response객체를 수정할 수 있습니다.
    • request-response 사이클을 종료할 수 있습니다.
      • 만약 현재 미들웨어 함수가 request-response사이클을 종료하지 않는다면 반드시 다음 미들웨어를 실행하도록 next()를 호출해야 합니다.
      • 그렇지 않으면 request가 응답하지 않는채로 멈춰있을 수 있습니다.
    • 스택에 있는 다음 미들웨어를 호출할 수 있습니다.

image

Example

  • Hello World!을 반환하는 Express 어플리케이션을 작성해 봅시다.
  • 처음에는 단순한 텍스트를 돌려주는 기능이지만 로그를 출력하는 myLogger와 요청한 시간을 출력해주는 requestTime을 미들웨어로 추가할 것 입니다.
var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

Middleware function myLogger

  • 미들웨어 함수 이름은 myLogger이고 단순히 “LOGGED”를 출력하는 기능을 합니다.
var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}
  • 생성한 미들웨어를 로딩하기위해 app.use()를 호출해야 합니다.
var express = require('express')
var app = express()

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

app.use(myLogger)

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)
  • 요청이 올 때마다 “LOGGED”를 출력합니다.
  • 미들웨어를 로딩하는 순서에 따라 실행되는 순서가 정해집니다.
  • 만약 Route path를 정의한 후에 미들웨어가 로딩된다면 실행되지 않습니다.

Middleware function requestTime

  • requestTime은 현재시간을 req객체에 저장합니다.
var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}
var express = require('express')
var app = express()

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

app.use(requestTime)

app.get('/', function (req, res) {
  var responseText = 'Hello World!<br>'
  responseText += '<small>Requested at: ' + req.requestTime + '</small>'
  res.send(responseText)
})

app.listen(3000)

Configurable Middleware

  • 만약 설정가능한 미들웨어를 만드려면 함수를 export해야합니다.
module.exports = function(options) {
  return function(req, res, next) {
    // Implement the middleware function based on the options object
    next()
  }
}
  • 미들웨어를 사용할 떄는 다음과 같이 사용합니다.
var mw = require('./my-middleware.js')

app.use(mw({ option1: '1', option2: '2' }))

Source

https://expressjs.com/en/guide/writing-middleware.html