Koa中间件next实现
学习Koa模仿一下中间件原理,与Express比较类似
const http = require("http")
// 处理中间件,实现next机制
function middlewareHandler(middlewareList) {
return function (ctx) {
function dispatchNext(i) {
const fn = middlewareList[i]
try {
return Promise.resolve(fn(ctx, dispatchNext.bind(null, i + 1)))
} catch (error) {
return Promise.reject(error)
}
}
dispatchNext(0)
}
}
class Koa {
constructor() {
this.middlewareList = []
}
use(middleware) {
this.middlewareList.push(middleware)
return this
}
createContext(req, res) {
return {
res,
req,
}
}
executeMiddleware(ctx, fn) {
return fn(ctx)
}
callback() {
const fn = middlewareHandler(this.middlewareList)
return (req, res) => {
const ctx = this.createContext(req, res)
return this.executeMiddleware(ctx, fn)
}
}
listen(...args) {
const server = http.createServer(this.callback())
server.listen(...args)
}
}
module.exports = Koa