前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Koa 中间件的原理及其应用

Koa 中间件的原理及其应用

作者头像
Leophen
发布2020-04-22 11:51:37
1K0
发布2020-04-22 11:51:37
举报
文章被收录于专栏:Web前端开发

一、Koa 中间件的原理

koa 把很多 async 函数组成一个处理链,每个 async 函数都可以做一些自己的事情,然后用 await next() 来调用下一个 async 函数。我们把每个 async 函数称为 middleware,这些 middleware 可以组合起来,完成很多有用的功能。koa 的中间件是通过 Async/Await 实现的,中间件执行顺序是“洋葱圈”模型,如图:

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

二、自定义 Koa 中间件

这里以三个中间件 m1.js、m2.js、m3.js 为例

代码语言:javascript
复制
$ cd project
$ mkdir middleware
$ cd middleware
$ touch m1.js
$ touch m2.js
$ touch m3.js

m1.js:

代码语言:javascript
复制
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')
  }
}

m2.js:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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')
  }
}

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

app.js:

代码语言:javascript
复制
const Koa = require('koa')
const app = new Koa()
const m1 = require('./middleware/m1')
const m2 = require('./middleware/m2')
const m3 = require('./middleware/m3')

app.use(m1())
app.use(m2())
app.use(m3())

输出:

三、Koa 中间件的应用

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

loginCheck.js:

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

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Koa 中间件的原理
  • 二、自定义 Koa 中间件
  • 三、Koa 中间件的应用
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档