Skip to content

express 的中间件模型,通常称作责任链模型

我们可以自定义代码来模拟实现责任链模型

js
const app = {
  middlewares: [],
  use (fn) {
    this.middlewares.push(fn)
  },
  compose (middlewares, req, res) {
    let index = -1
    function next () {
      ++index
      if (index > middlewares.length - 1) return
      const middleware = middlewares[index]
      middleware(req, res, next)
    }
    next()
  },
  listen (port) {
    // http.createServer(req, res)
    const req = {}
    const res = {}
    this.compose(this.middlewares, req, res)
    console.log(`app listening on port ${port}`)
  }
}

app.use(async (req, res, next) => {
  console.log('middleware 1')
  await next()
  console.log('middleware 1 after')
})

app.use(async (req, res, next) => {
  console.log('middleware 2')
  await next()
  console.log('middleware 2 after')
})

app.use(async (req, res, next) => {
  console.log('async')
  await next()
  await new Promise((resolve) => {
    setTimeout(() => {
      console.log('async end in 3s')
      resolve()
    }, 3000)
  })
})

app.use(async (req, res, next) => {
  console.log('middleware 3')
  await next()
  console.log('middleware 3 after')
})

app.listen(3000)

上述代码执行结果为:

zsh
middleware 1
middleware 2
async
middleware 3
app listening on port 3000
middleware 3 after
middleware 2 after
middleware 1 after
async end in 3s