中间件是在匹配路由前、匹配路由后做的一系列的操作,Egg 是基于 Koa 实现的,所以 Egg 的中间件形式和 Koa 的中间件形式是一样的,都是基于洋葱圈模型,下面用一个实例来介绍在Egg中如何使用中间件,以屏蔽用户IP为例。
首先在 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 '_1532656413112_8161';
// 配置定义的中间件
config.middleware = ['forbidIp'];
// 给配置的中间件传入参数,即屏蔽的IP列表
config.forbidIp = {
forbidIpList: [
'127.0.0.1',
'192.168.0.10'
]
}
return config;
};
然后在 app 文件夹下的 middlware 中定义中间件文件 forbidIp.js,代码如下:
代码语言:javascript复制module.exports = (options, app) => {
// options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来
// app: 当前应用 Application 的实例
// 返回一个异步的方法
return async function forbidIp(ctx, next) {
// 接受要屏蔽的IP列表,也可以从数据库查询出来要屏蔽的IP
var forbidIpList = options.forbidIpList;
// 获取客户端的IP
var clientIp = ctx.request.ip;
// 判断客户端的IP是否在屏弊的IP列表里
var hasIp = forbidIpList.some(function (val) {
if (val == clientIp) {
return true;
}
})
// 如果当前用户的IP已经被屏蔽
if (hasIp) {
// 屏蔽
ctx.status = 403;
ctx.body = '您的IP已经被屏蔽';
} else {
await next();
}
}
};
为了便于演示,上面的屏蔽IP列表是在配置文件传的参数过来获取的,实际的项目中,屏蔽IP列表都是从数据据获取的。
完成上面的操作后,访问 127.0.0.1:7001 就会显示当前IP已经被屏蔽,而访问 localhost:7001,则可以正常访问。