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