koa2如何实现并串联中间件

一、koa2 实现自定义中间件
  1. koa2 项目中,创建 middleware 文件夹,用于存放中间件,再在里面创建 m1.js 文件,定义中间件 m1ctx是维护 requestresponse进出 app 的承载,Koa Contextnoderequestresponse 对象封装到单个对象中,为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.requestctx.response,不然的话它们是相同的,代码如下所示:
function m1(ctx) {
    global.console.log('m1')
}

module.exports = function () {
    return async function (ctx, next) {
        global.console.log('m1 start')
        // 执行当前的中间件
        m1(ctx)
        // 当前中间件执行完毕以后,执行下一个中间件
        await next()
        global.console.log('m1 end')
    }
}
  1. koa2 项目中的 app.js 文件中,引入 m1 中间件,并且使用它,代码如下所示:
const m1 = require('./middleware/m1')
app.use(m1())
  1. koa2中间件的过程分析:
  • 首先是 next 的调用,我们知道 Koanext 执行,其实就是在执行下一个中间件的函数,即下一个 use 中的 async函数,为了保证后面的异步代码执行完毕后再继续执行当前的代码,所以我们需要使用 await 进行等待
  • 其次就是数据从接收到挂在 ctx.request.body 都在 Promise 中执行,是因为在接收数据的操作是异步的,整个处理数据的过程需要等待异步完成后,再把数据挂在 ctx.request.body 上,可以保证我们在下一个 useasync 函数中可以在 ctx.request.body 上拿到数据,所以我们使用 await 等待一个 Promise 成功后再执行 next
二、koa2 串联中间件
  1. Koa 中间件是以级联代码(Cascading) 的方式来执行的,类似于回形针的方式,也是洋葱模型。
  2. middleware中,再创建 m2.jsm3.js,定义中间件m2m3,代码如下所示:
  • m2.js
function m2(ctx) {
    global.console.log('m2')
}

module.exports = function () {
    return async function (ctx, next) {
        global.console.log('m2 start')
        m2(ctx)
        await next()
        global.console.log('m2 end')
    }
}
  • m3.js
function m3(ctx) {
    global.console.log('m3')
}

module.exports = function () {
    return async function (ctx, next) {
        global.console.log('m3 start')
        m3(ctx)
        await next()
        global.console.log('m3 end')
    }
}
  1. app.js 中,去使用 m2m3 中间件,代码如下所示:
const m2 = require('./middleware/m2')
const m3 = require('./middleware/m3')

app.use(m2())
app.use(m3())
  1. 在最后的结果执行中,先执行 m1 start,然后 m1next先不会执行,然后执行 m2 start,然后 m2,再后面是执行 m3 start,然后 m3,从先往后执行。但是最后执行next的实现,是先执行 m3 中间件,输出 m3,然后执行 m2 中间件,输出 m2,最后执行 m1 中间件,输出 m1,这个也说明了先执行的后出,后执行的先出,也是洋葱模型。

  2. compose 这个方法的实现思想非常的重要,在 Koa 源码中用于串联中间件,主要思想是递归函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值