eggjs agent.js 的使用----如何将redis订阅事件提取到agentjs中
我的业务场景和官方《多进程模型和进程间通讯》描述的场景是一致的。 目前 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,
};