我正在尝试在Node.JS中实现父进程和子进程之间的发布/订阅。
我使用的是node-redis版本4.6.7和redis服务器版本6.2.12。
我构建了一个Connection对象,它有自己的模块。它处理与redis的连接,然后返回 Package 在promise中的已连接客户端。
if (isDev) {
this.client = createClient({ url: config.REDIS_URL_DEV });
} else {
this.client = createClient({ url: config.REDIS_URL_PROD });
}
this.promisedClient = new Promise((resolve) => {
this.client.connect().then(() => {
resolve(this.client);
});
});
我需要在父进程和子进程中的模块。
在子进程中,我订阅了父进程发送消息的通道:
const sub = c.duplicate();
sub.connect().then(() => {
sub.subscribe('PuppeteerScraper::IN', (source) => { ... here goes my handler code ... })
})
在父进程内部,在我确定子进程已经订阅之后,我发布了一条消息:
proc.stdout.on('data', data => {
const decodedData = data.toString('utf8');
if (decodedData === 'PuppeteerScraperWorker::Subscribed') {
client.then(c => {
c.publish('PuppeteerScraper::IN', JSON.stringify(source));
})
}
})
问题是,子订阅时没有错误,父发布时没有错误。最后,子进程不接收数据。
当我打开探查器时,我看到了publish命令,但没有subscribe命令。
04:59:29.246 [0 192.168.1.209:24164] "PUBLISH" "PuppeteerScraper::IN" "{"scraper":"Puppeteer","url":"<redacted>"}"
基本上,来自子进程的subscribe命令不会显示在分析器中。
1条答案
按热度按时间wlwcrazw1#
解决了。原来我没有告诉子进程连接到dev,所以父进程在和DEV对话,而子进程在和PROD对话。