Koa2 中间件的原理及其应用

一、Koa2 中间件的原理

koa2 的中间件是通过 Async/Await 实现的,中间件执行顺序是“洋葱圈”模型,如图:

原理:中间件之间通过 next 函数联系,当一个中间件调用 next() 后,会将控制权交给下一个中间件,直到下一个中间件不再执行 next() 时沿路返回,依次将控制权交给上一个中间件。 

二、自定义一个 Koa2 中间件

 
 
$ cd project
$ mkdir middleware
$ cd middleware $ touch koa-mymiddleware.js

koa-mymiddleware.js:

function mymiddleware (ctx) {
  global.console.log('mymiddleware',ctx.path)
}

module.exports = function () {
  return async function (ctx, next) {
    mymiddleware(ctx)
    await next()
  }
}

其中,参数 ctx 是由 koa 传入的封装了 request 和 response 的变量,我们可以通过它访问 request 和 response,next 是 koa 传入的将要处理的下一个异步函数。

app.js:

const Koa = require('koa')
const app = new Koa()
const mymiddleware = require('./middleware/koa-mymiddleware')

app.use(mymiddleware())

  

三、Koa2 中间件的应用

可用于登陆验证的中间件:

loginCheck.js:

module.exports = async (ctx, next) => {
    if (ctx.session.username) {
        // 登陆成功则执行 await next() 进行下一步操作
        await next()
        return
    }
    // 登陆失败则禁止继续执行,所以不需要执行 next()
    ctx.body = {
        code: -1,
        msg: '登陆失败'
    }
}

在删除操作中使用 loginCheck.js :

router.post('/delete', loginCheck, async (ctx, next) => {
    const author = ctx.session.username
    const id = ctx.query.id
    // handleDelete() 是一个处理删除的方法,返回一个 promise
    const result = await handleDelete(id, author)

    if (result) {
        ctx.body = {
            code: 0,
            msg: '删除成功'
        }
    } else {
        ctx.body = {
            code: -1,
            msg: '删除失败'
        }
    }
})

更多 Koa ctx:https://koa.bootcss.com/#context

猜你喜欢

转载自www.cnblogs.com/Leophen/p/12741098.html