中间件:匹配路由前、匹配路由完成做的一系列操作。
Egg是基于Koa实现的,所有Egg的中间件形式和Koa的中间件形式是一样的,都是基于洋葱模型。
Koa中的中间件:
https://eggjs.org/zh-cn/intro/egg-and-koa.html#middleware
Egg中的中间件:
http://eggjs.org/zh-cn/basics/middleware.html
一般来说中间件也会有自己的配置。在框架中,一个完整的中间件是包含了配置处理的。我们约定一个中间件是一个放置在 app/middleware 目录下的单独文件,它需要 exports 一个普通的 function,接受两个参数:
options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
app: 当前应用 Application 的实例。
1、app/middleware 下面新建 forbidip.js 内容如下:
/**
* 拦截特殊ip,防止爬虫
* options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来
* app: 当前应用 Application 的实例
* 每次路由变化都会触发 中间件
*/
module.exports = (options, app) => {
return async function forbidipMiddleware(ctx, next) {
/**
* 要屏蔽的ip
* 1、从数据库获取
* 2、从参数传入
*/
console.log(options);
console.log(ctx.request.ip);
// 获取客户端的ip
var sourceIp = ctx.request.ip;
const match = options.ip.some(val => {
if(val == sourceIp){
return true;
}
});
if(match){
ctx.status = 403;
// message 接受的字符不能有中文,否则会报错
// ctx.message = 'Your IP has been blocked';
ctx.body = '您的ip已经被屏蔽';
}else{
await next();
}
}
}
2、找到 config.default.js 配置当前项目需要使用的中间件以及中间件的参数
// 增加配置中间件
config.middleware = ['forbidip'];
// 给pforbidip中间件传入的参数
config.forbidip = {
ip: ['192.168.0.10']
}
3.注意
传入的中间件名称 需要与 中间件文件名 相同
