zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Egg middleware 中间件

中间件 Middleware Egg
2023-09-11 14:15:29 时间

中间件:匹配路由前、匹配路由完成做的一系列操作。
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.注意

传入的中间件名称 需要与 中间件文件名 相同