一、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