在路由中使用中间件

  • 只有指定路由可以使用中间件,无需在config配置
  • 只需在相关路由的js中引入中间件,给指定路由配置中间件,在第二个参数配置

具体步骤如下:

  • 新建app/middleware/test.js
module.exports=(option,app)=>{
    return async function auth(ctx,next){
        console.log(option);
        console.log(new Date());
        await next();
    }
}
  • router.js 挂载指定的中间件
module.exports = app => {
    const { router, controller } = app;
    // 路由中获取中间件
    const testM = app.middleware.test({ title: 'this is test middle ware!' });
    router.get('/', testM, controller.home.index); 
    router.get('/news', controller.news.index);
};
  • 此处只在首页会输出中间件信息,在其他路由没有中间件信息,这样就实现了

框架默认中间件的配置

在eggjs中内置了bodyParser中间件,这时候我们可以在框架中配置东西,一般无需配置,没有太多意义

// 对post提交数据的限制
config.bodyParser = {
    jsonLimit: '10mb' //Default is 1mb. 
}

官方文档:https://eggjs.org/zh-cn/basics/middleware.html

在Eggjs中引入koa的中间件

1 ) 规范的 Koa 的中间件

  • 规范的Koa中间件比如: koa-jsonp、koa-cors, 直接可以在Koa中 app.use('中间件') 的中间件
  • 在 Egg.js 框架里面可以非常容易的引入 Koa 中间件生态, Koa中间件基本都可以在Eggjs中使用
  • 使用 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));
  • 在eggjs中,我们按照框架的规范来在应用中加载这个 Koa 的中间件:
// app/middleware/compress.js
// koa-compress 暴露的接口(`(options) => middleware`)和框架对中间件要求一致
module.exports = require('koa-compress');
config.middleware = ['compress'];
config.compress = {
    threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩
};
  • 以及koa-jsonp插件也可以同样应用

2 ) 非规范的 Koa 中间件

  • 比如像是这类中间件, 有多个参数的中间件,就是很典型的非标准中间件,需要解决参数的问题
const Middleware = require('some-kind-mw');
app.use(Middleware(a, b))
  • 这样解决:
// 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:设置符合某些规则的请求不经过这个中间件。
  • 举例:
// add your middleware config here 加入中间件名
config.middleware = [ 'printdatex', 'forbidip', 'auth', 'jsonp', 'compress' ];
// 给中间件传入参数
config.printdatex = {
    aaa: 'aaa', // 自定义的参数
    ignore: '/news', // 通用配置
};
config.compress = {
    enable: false, // 这里关闭,这种配置叫做通用配置
    match: 'news/', // 通用配置,匹配到的会执行中间件, 和ignore不能同时用
    threshold: 1024, // 它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩
};
config.auth = {
    // 通用配置,使用match函数可以匹配多个
    match(ctx) {
        // ctx 上下文 可以获取请求的地址
        console.log(ctx.request.url);
        if (ctx.request.url === '/shop' || ctx.request.url === '/news') {
            return true; // 这类匹配
        }
        return false; // 不匹配
    }
};