中间件:匹配路由前、匹配路由完成做的一系列的操作。 Egg 是基于 Koa 实现的,所以 Egg 的中间件形式和 Koa 的中间件形式是一样的,都是基于洋葱圈模型
Koa中的中间件:
http://eggjs.org/zh-cn/intro/egg-and-koa.html#midlleware
Egg中的中间件:
http://eggjs.org/zh-cn/basics/middleware.html
一般来说中间件也会有自己的配置。在框架中,一个完整的中间件是包含了配置处理的。我们约定一个中间件是一个放置在 app/middleware 目录下的单独文件,它需要 exports 一个普通的 function,接受两个参数:
options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
app: 当前应用 Application 的实例。
demo:
app/middleware文件下
创建中间件forbidip.js和printdate.js中间件:
module.exports = (options, app) => { //返回一个异步的方法 return async function forbidIp(ctx,next){ //要屏蔽的id : 1.从数据库获取 2、从参数传入 var forbidips=options.forbidips; // console.log(forbidips); //获取客户端的ip var clientIp=ctx.request.ip; //some和forEach相似 var hasIp=forbidips.some(function(val){ if(val==clientIp){ return true; } }) if(hasIp){ //屏蔽 ctx.status = 403; ctx.body='您的ip已经被屏蔽'; }else{ await next(); } } }; // module.exports = (options, app) => { // //返回一个异步的方法 // return async function forbidIp(ctx,next){ // //要屏蔽的id : 1.从数据库获取 2、从参数传入 // /*要屏蔽的ip*/ // var forbidip='127.0.0.1'; // //获取客户端的ip // // console.log(ctx.request.ip) // if(ctx.request.ip==forbidip){ // ctx.status = 403; // ctx.body='您的ip已经被屏蔽'; // }else{ // await next(); // } // } // };
/* options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。 app: 当前应用 Application 的实例。 配置中间件 */ module.exports = (options, app) => { console.log(options); //返回一个异步的方法 return async function printDate(ctx,next){ console.log(new Date()); await next(); } };
在config.defalt.js下
// 增加配置中间件 config.middleware = ['printdate','forbidip']; //给printdate中间件传入的参数 config.printdate={ aaa:'aaaaaa' } config.forbidip={ forbidips:[ '127.0.0.1', '192.168.0.195' ] }
在 router.js 路由中使用中间件
创建 middleware/auth.js
module.exports=(option,app)=>{ return async function auth(ctx,next){ console.log(option); console.log(new Date()); await next(); } }
module.exports = app => { const { router, controller } = app; //路由中获取中间件 const auth = app.middleware.auth({ attr: 'this is router.js middleware' }); router.get('/', auth,controller.home.index); router.get('/news', controller.news.index); router.get('/shop', controller.shop.index); };
框架默认中间件的配置
config.bodyParser={ jsonLimit: '10mb' //Default is 1mb. }
Egg.js 中使用 koa 的中间件 (规范的 Koa 的中间件)
在 Egg.js 框架里面可以非常容易的引入 Koa 中间件生态。
使用 koa-compress 开启服务器 Gzip 压缩功能,以 koa-compress 为例,在 Koa 中使用的方 法:
const koa = require('koa'); const compress = require('koa-compress'); const app = koa(); const options = { threshold: 2048 }; app.use(compress(options));
按照规范来在应用中加载这个 Koa 的中间件:
module.exports = require('koa-compress');
config.middleware = ['compress']; config.compress = { threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩 };
Egg.js 中使用 koa 的中间件 (非规范的 Koa 中间件)
// config/config.default.js module.exports = { webpack: { compiler: {}, others: {}, }, }; // app/middleware/webpack.js const webpackMiddleware = require('some-koa-middleware'); module.exports = (options, app) => { return webpackMiddleware(options.compiler, options.others); }
Egg.js 中间件的通用配置
enable:控制中间件是否开启。
match:设置只有符合某些规则的请求才会经过这个中间件。
ignore:设置符合某些规则的请求不经过这个中间件。
https://eggjs.org/zh-cn/basics/middleware.html
demo:
egg 中间件的基本配置
app/middleware/auth.js
module.exports=(option,app)=>{ return async function auth(ctx,next){ console.log(option); //实现中间件的功能 console.log(new Date()); await next(); } }
config/config.default.js
// 配置中间件 config.middleware = ['auth']; //给中间件传参 config.auth={ title:'this is auth' }
路由中使用中间件
router.js中
'use strict'; /** * @param {Egg.Application} app - egg application */ module.exports = app => { const { router, controller } = app; //路由中获取中间件 var auth=app.middleware.auth({title:'this is router.js middleware'}) router.get('/',auth, controller.home.index); };
egg中使用koa中间件插件
在app/middleware下
创建compress.js
//egg.js中使用koa-compress开启压缩 /* egg.js中配置koa-compress模块: 1、安装 cnpm install koa-compress --save 2、middleware文件夹下面新建一个compress.js 3、在jsonp.js中引入koa-compress 并且通过module.exports暴露 module.exports=require('koa-compress'); 4、config.default.js中配置jsonp中间件 config.middleware = ['compress']; */ module.exports=require('koa-compress'); //非标准的中间件 /* koa中的非标准中间件的配置 const Middleware = require('some-koa-middleware'); app.use(Middleware(options.compiler,options.xxxx)) egg.js中非标准的中间件配置: const Middleware = require('some-koa-middleware'); module.exports=(option,app)=>{ return Middleware(options.compiler,options.xxxx); } */
jsoup.js
//egg.js的中间件生态基于koa /* egg.js中配置koa-jsonp模块: 1、安装 cnpm install koa-jsonp --save 2、middleware文件夹下面新建一个jsonp.js 3、在jsonp.js中引入koa-jsonp 并且通过module.exports暴露 module.exports=require('koa-jsonp'); 4、config.default.js中配置jsonp中间件 config.middleware = ['jsonp']; */ var jsonp=require('koa-jsonp'); module.exports=jsonp;
在config.default.js配置中间件
// 配置中间件 config.middleware = ['jsonp','compress']; config.compress = { threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩 }; //框架中间件的默认配置 config.bodyParser={ jsonLimit: '10mb' //Default is 1mb. }
egg中的通用设置
/ config.middleware = ['auth','jsonp','compress','adminAuth']; // 配置中间件 config.middleware = ['auth','jsonp','compress']; config.compress = { // enable:false, threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩 }; //https://eggjs.org/zh-cn/basics/middleware.html config.auth = { // enable:false, // match: '/news', // ignore:'/news', match(ctx){ // ctx 上下文 可以获取请求的地址 console.log(ctx.request.url); if(ctx.request.url=='/shop' || ctx.request.url=='/news'){ return true; } return false; }, title:'this is middleware' };