if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
}
return function (context, next) {
// 采用闭包将索引缓存,来完成调用计数
let index = -1
return dispatch(0)
function dispatch (i) {
// 避免next()办法重复调用
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
index = i
let fn = middleware[i]
if (i === middleware.length) fn = next
if (!fn) return Promise.resolve()
try {
// 包装next()前往值为Promise对象
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
} catch (err) {
// 异常处置
return Promise.reject(err)
}
}
}
}
应用koa中间件机制完成一个本人的koa中间件学习了中间件的设计机制和原理, 我们是不是想马上写一个中间件呢? 笔者这里给大家举一个例子. 在H5-Dooring项目的效劳端代码中, 我们需求对用户登录权限停止分发, 此时我们提供一致个中间件来处置, 如下代码所示:
// 模拟数据库操作
const token = db.user();
// router或许koa的中间件一定要用await处置next,否则将不能正常照应数据
export default async (ctx, next) => {
const t = ctx.request.header.authorization
let uid = ctx.request.header['x-requested-with']
let uidArr = uid.split(',')
if(uidArr.length > 1) {
uid = uidArr.pop().trim()
}
if(token[uid] && token[uid][1] === t) {
await next()
}else {
ctx.status = 403;
ctx.body = {
state: 403,
msg: '你没有权限操作'
}
}
}
以上代码即完成用户登录态处置, 假设用户在没有登录的状况下防问任何需求登录的接口, 都将前往权限不足或则在央求库中让其重定向到登录页面.
所以, 明天你又博学了吗?
【编辑引荐】
PHP静态网站开发实录之前台UI设计切页视频课程
SQLServer2019数据库初级开发
整合 Windows 11 界面,微软教开发者如何用 WinUI/Fluent Design 晋级其现有顺序
iOS 14.8初次现身苹果正开发:不想升iOS 15的有新选择了!
清林云BaaS康文昌:API后端即效劳将成为数字化基建
(责任编辑:admin)