Egg.js中间件的核心用法
一、在应用中使用中间件
在app/middleware文件夹下新建一个auth2.js
module.exports = (option,app) => { return async function auth2(ctx,next) { console.log(new Date); // 下面的这个语句很重要,如果没有下面这个语句,线程执行到这里就要终止了 await next(); } } 复制代码
注册中间件
在config.default.js中进行注册。
config.middleware = ['auth2']; 复制代码
给中间件传参
config.middleware = ['auth2']; 复制代码
中间件读取传过来的参数
return async function auth2(ctx,next) { console.log(option); console.log(new Date); // 下面的这个语句很重要,如果没有下面这个语句,线程执行到这里就要终止了 await next(); } 复制代码
二、在router.js中使用中间件
本节的目标是给指定路由配置中间件。下面的这种方式,不需要再config.default.js中注册路由了。
定义中间件的方式和上文的定义方式一致。
在router.js中获取中间件,并指定哪些路由能够触发。
module.exports = app => { const { router, controller } = app; const auth = app.middleware.auth(); router.get('/',auth, controller.home.setSession); router.get('/news', controller.news.index); router.get('/deletecookie',controller.home.deletecookie) }; 复制代码
三、Egg.js中使用KOA的中间件
下文我们以egg中使用koa-jsonp这个中间件为例进行系统性阐述。
安装koa-jsonp
npm install koa-jsonp 复制代码
在app/middleware中新建一个jsonp.js
// 配置KOA的中间件 const jsonp = require('koa-jsonp'); module.exports = jsonp; 复制代码
注册中间件(在config.default.js)
config.middleware = ['jsonp']; 复制代码
请求指定路径
http://127.0.0.1:7001/shop?callback=666 复制代码
下文继续讲一个koa-compress的中间件,这个中间件能够开启服务器Gzip压缩的功能。
安装koa-compress
npm install koa-compress 复制代码
在app/middleware下新建一个compress.js
module.exports = require('koa-compress'); 复制代码
注册中间件
config.middleware = ['jsonp','compress']; 复制代码
配置中间件的参数
config.compress = { threshold: 1024 // 设置压缩门限值 } 复制代码
此时访问指定页面的文件都是经过压缩的文件了。
如果是非标准的中间件,中间件的定义方式如下所示:
// 下面演示非标准中间件的使用 const middleWare = require('xxx'); module.exports = (option,app) => { return middleWare(options1,options2) } 复制代码
四、中间件的通用配置
无论是引用层加载的中间件还是框架再带的中间件,都支持下面三个通用的配置项。
enable:控制中间件是否开启。
match:设置只有符合某些规则的请求才会经过这个中间件。
ignore:设置符合某些规则的请求不经过这个中间件。
禁用某个中间件
config.compress = { enable: false, threshold: 10 // 设置压缩门限值 } 复制代码
设置让某个路由能匹配中间件
config.auth = { match: '/news', title: 'auth 你好' } 复制代码
如果想忽略某个路由,可以使用下面的写法
config.auth = { ignore: '/news', title: 'auth 你好' } 复制代码
如果要处理的路由情况比较复杂,我们还可以使用下面的match方法
config.auth = { match(ctx) { if (ctx.request.url === '/shop' || ctx.request.url === "/news") { return true; } return false }, title: 'auth 你好' } 复制代码
五、设置未经授权的用户无法访问指定页面
在app/middleware/ 下创建指定中间件
module.exports = (option,app) => { return async function auth(ctx,next) { if (ctx.session && ctx.session.userinfo) { await next() } else { if (ctx.request.url === '/') { await next(); } else { ctx.redirect('/'); } } } } 复制代码
注册中间件
config.middleware = ['auth','compress','adminAuth']; 复制代码
让指定路径的路由触发中间件
config.adminAuth = { match: '/admin/user' }
作者:Always_positive
链接:https://juejin.cn/post/7024033607257686023