Egg 中间件使用详解

2020-11-26 10:39:42 浏览数 (1)

1. 自定义中间件全局配置

1. 在 middleware 文件夹中定义中间件文件,如 auth.js,并实现自定义的功能。

代码语言:javascript复制
module.exports = (option, app) => {
    return async function auth(ctx, next) {
        // 获取配置所传的参数
        console.log(option);
        // 实现中间件的功能
        console.log(new Date());
        await next();
    }
}

2. 在 config 文件夹中的config.default.js中配置中间件。

代码语言:javascript复制
'use strict';

module.exports = appInfo => {
    const config = exports = {};
    config.keys = appInfo.name   '_1532511512428_3477';

    // 配置全局中间件
    config.middleware = ['auth'];
    // 给配置的中间件传参
    config.auth = {
        title: 'this is auth'
    };
    
    config.view = {
        mapping: {
            '.html': 'ejs',
        },
    };
    return config;
};

以上的中间件属于全局配置,不能有针对性的对每个路由实现单独配置。

2. 对指定路由使用中间件

1. 在 middleware 文件夹中定义中间件文件,如 auth.js,并实现自定义的功能。

代码语言:javascript复制
module.exports = (option, app) => {
    return async function auth(ctx, next) {
        // 获取配置所传的参数
        console.log(option);
        // 实现中间件的功能
        console.log(new Date());
        await next();
    }
}

2. 在 router.js 中对指定的路由使用中间件。

代码语言:javascript复制
'use strict';

module.exports = app => {
    const { router, controller } = app;
    // 路由中获取中间件并传参
    var auth = app.middleware.auth({ title: 'this is router.js  middleware' })
    // 第二个参数传入中间件,即为使用中间件
    router.get('/', auth, controller.home.index);
    router.get('/news', auth, controller.news.index);
    // 不使用中间件
    router.get('/shop', controller.shop.index);
};

3. 对框架自带的中间件进行配置

Egg 框架集成了bodyParser中间件,用于接收POST请求获取数据,而默认的接收数据大小为1MB,可以修改这个选项。

代码语言:javascript复制
'use strict';

module.exports = appInfo => {
    const config = exports = {};
    config.keys = appInfo.name   '_1532511512428_3477';

    // 配置框架自带的中间件
    config.bodyParser = {
        // 默认1MB
        jsonLimit: '10mb'
    }

    return config;
};

4. 在 Egg 中使用Koa 的标准中间件

Egg 框架本身自带了一部分的中间件,然而有些情况下,需要实现一些特殊的功能,就需要使用一些Koa的中间件,毕竟Koa的生态圈要强大一些,在Egg中可以很方便的集成Koa的中间件。

以 koa-compress 为例,开启服务器 Gzip 压缩功能,在 Koa中的使用方法如下:

代码语言:javascript复制
const koa = require('koa'); 
const compress = require('koa-compress'); 
const app = koa(); 
const options = { threshold: 2048 }; 
app.use(compress(options));

在Egg中使用方法如下:

1. 安装koa-compress中间件。

代码语言:javascript复制
cnpm  install koa-compress --save

2. 在middleware文件夹下面新建中间件文件compress.js,在文件中引入koa-compress并导出。

代码语言:javascript复制
module.exports=require('koa-compress');

3. 在config文件夹中的config.default.js中配置中间件。

代码语言:javascript复制
'use strict';

module.exports = appInfo => {
    const config = exports = {};
    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name   '_1532511512428_3477';
    // 配置中间件
    config.middleware = ['compress'];
    config.compress = {
        // 设置传输数据大于多少时才进行压缩
        threshold: 1024 
    };
    return config;
};

5. 在 Egg 中使用Koa 的非标准中间件

非标准的koa中间件在使用时一般都要传入两个参数,在Egg中使用方式如下:

1. 安装中间件。

代码语言:javascript复制
cnpm  install koa-example --save

2. 在middleware文件夹下面新建中间件文件example.js,在文件中引入koa-example并导出。

代码语言:javascript复制
const Example = require('koa-example');
module.exports=(option,app)=>{
    // 传入参数
    return Example(ptions.compiler, options.others);
}

3. 在config文件夹中的config.default.js中配置中间件。

代码语言:javascript复制
module.exports = { 
    // 给中间件传参
    Example: { 
        compiler: {}, 
        others: {}, 
    }, 
};

6. Egg.js 中间件的通用配置

无论是应用层加载的中间件还是框架自带中间件,都支持几个通用的配置项:

1. enable:控制中间件是否开启。

2. match:设置只有符合某些规则的请求才使用这个中间件。

3. ignore:设置符合某些规则的请求不使用这个中间件。

代码语言:javascript复制
// config/config.default.js
'use strict';

module.exports = appInfo => {
    const config = exports = {};
    config.keys = appInfo.name   '_1532511512428_3477';

    // 为middleware下的auth.js中间件进行全局配置
    config.auth = {
        // 是否启用中间件
        enable:true, 

        // 路由为/news才使用中间件
        match: '/news',

        // 路由为/news不使用中间件
        // ignore:'/news',

        title: 'this is  middleware'
    };
    return config;
};

match 与 ignore 意思相反,不能同时使用,当匹配规则比较多的时候,可以用一个函数来实现。

代码语言:javascript复制
// config/config.default.js
'use strict';

module.exports = appInfo => {
    const config = exports = {};
    config.keys = appInfo.name   '_1532511512428_3477';

    // 为middleware下的auth.js中间件进行全局配置
    config.auth = {
        // 是否启用中间件
        enable:true, 
        // 定义函数匹配规则
        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'
    };
    return config;
};

0 人点赞