关于 agent.js 中获取 redis 实例问题
发布于 5 年前 作者 Sirormy 4013 次浏览 来自 分享

先说解决方法,再说解决和分析的过程。

在 config.redis 里配置 agent: true

起因是最近在最近在尝试解决集群下单 worker schedule 的问题,但是在 start 方法中,获取不到 redis 对象。 根据 egg-schedule 文档里的建议,要在 agent.js 声明并使用 CustomScheduleStrategy,agent.js 代码如下:

// {app_root}/agent.js
module.exports = function(agent) {
  class CustomStrategy extends agent.ScheduleStrategy {
    start() {
      // such as mq / redis subscribe
      agent.redis.subscribe('remote_task', data => {
        this.sendOne(data);
      });
    }
  }
  agent.schedule.use('custsom', CustomStrategy);
};

看了一眼 egg/lib/loader/agent_work_loader.js 中的代码,通过 agent.redis 实例应该可以取得到,但是没有取到。

const EggLoader = require('egg-core').EggLoader;

/**
 * Agent worker process loader
 * @see https://github.com/eggjs/egg-loader
 */
class AgentWorkerLoader extends EggLoader {

  /**
   * loadPlugin first, then loadConfig
   */
  loadConfig() {
    this.loadPlugin();
    super.loadConfig();
  }

  load() {
    this.loadAgentExtend();
    this.loadContextExtend();

    this.loadCustomAgent();
  }
}

module.exports = AgentWorkerLoader;

遂有查了一下 egg-redis 的代码,发现 agent.js 里的代码:

'use strict';

const redis = require('./lib/redis');

module.exports = agent => {
  if (agent.config.redis.agent) redis(agent);
};

我在想这个 agent.config.redis.agent 到底是个什么?半天才反应过来,这是个配置项 …

然后赶紧翻了一下 egg-redis/config/config.default.js

'use strict';

exports.redis = {
  default: {
  },
  app: true,
  agent: false,
  ...
}  

于是乎,修改 config.js 里的 redis.agent = true,搞定。 整个过程下来感觉 egg-schedule 和 egg-redis 的文档里没有显式的提到这个参数的配置导致浪费了一点时间,可能大家共识就是应该去对应的配置里开启,但是总有像我一样没有考虑到的人,还是希望中间件文档能相对写的详尽一点。

回到顶部