eggjs agent.js 的使用----如何将redis订阅事件提取到agentjs中
发布于 9 个月前 作者 feiyuchuixue 3683 次浏览 来自 问答

我的业务场景和官方《多进程模型和进程间通讯》描述的场景是一致的。 目前 redis 的订阅事件是在app.js 中写的,如下:

  //app.js
  async didReady() {
    // 应用已经启动完毕
    // 获取ctx
    const ctx = await this.app.createAnonymousContext();
    // 订阅redis 事件
    this.app.redis.clients.get('client').subscribe('forbidden_ip', (err, result) => {
      if (err) {
        throw err;
      }
      console.log(result, 'psubscribe');
    });

    // 处理订阅到的消息
    this.app.redis.clients.get('client').on('message', (channel, message) => {
      switch (channel) {
        case 'forbidden_ip':
          // 更新ip名单
          ctx.service.catchService.update();
          break;
        default:
          ctx.logger.info('未处理的订阅事件:channel-【' + channel + '】,message-【' + message + '】');
      }
      console.log(message, channel);
      // console.log(message, 'music');
    });
  }

问题: ```js //agent.js this.app.redis.clients.get(‘client’).subscribe();


在 agent.js 中 无法获取 redis,只能获取agent。
请问大家有什么好想法吗。

ps:新手一枚,之前用的express ,最近在学习eggjs。
3 回复

agent 可以获得redis客户端的,你应该用的是egg-redis插件,需要配置agent:true,来配置将redis也挂载到agent上。

@HobaiRiku 感谢您的回复,我确实是使用的egg-redis插件,我最后的解决方案是又安装了redis 插件,然后在agent 通过require注入的。劳烦请教 agent:true 这个配置具体的配置位置。

//config.default.js
config.redis = {
  clients: {
    client: {
    port: ‘’,
    host: ‘’,
    password: ‘’,
    db: 0, // 数据库
    },
    // 用于发布订阅
    client_pub: {
    port:  ‘’,
    host:  ‘’,
    password:  ‘’,
    db: 0,
    },
  },
};

@HobaiRiku 感谢您的回复,我已经解决问题。贴出代码,希望可以帮到大家。

//agent.js
module.exports = agent => {

  console.log(agent.redis.clients.get('client_pub'));
  agent.redis.clients.get('client_pub').subscribe('forbidden_ip', (err, result) => {
    if (err) {
      throw err;
    }
    console.log(result, 'redis订阅事件');
  });
  agent.redis.clients.get('client_pub').on('message', (channel, message) => {
    switch (channel) {
      case 'forbidden_ip':
		 //通知app
        agent.messenger.sendToApp('forbidden_ip', 'refresh');
        break;
      default:
        agent.ctx.logger.info('未处理的订阅事件:channel-【' + channel + '】,message-【' + message + '】');
    }
  });

};
//app.js

  async didReady() {
    const ctx = await this.app.createAnonymousContext();
    // eslint-disable-next-line no-unused-vars
    //监听agent的ipc请求
    this.app.messenger.on('forbidden_ip', by => {
      // create an anonymous context to access service
      const ctx = this.app.createAnonymousContext();
      ctx.runInBackground(async () => {
        // 更新ip名单
        await ctx.service.catchService.update();
      });
    });

    // 项目启动,初始化更新ip名单
    await ctx.service.catchService.update();
  }

//config.default.js
  config.redis = {
    clients: {
      client: {
        port: ****,
        host: '****,',
        password: '****,',
        db: 0, 
      },
      // 用于发布订阅
      client_pub: {
        port: ****,,
        host: '****,',
        password: '****,',
        db: 0,
      },
    },
    //是否挂在到agent上,默认是false不挂载
    agent: true,
  };
回到顶部