Node.js Redis pub/sub-监听一个频道的同一进程

Node.js Redis pub/sub-监听一个频道的同一进程,node.js,express,redis,Node.js,Express,Redis,我有一个Node.js服务器-我希望进程能够侦听从自身发送的消息-这只是用于测试。我遇到的问题是,当向同一进程发布消息时,订阅者似乎根本没有收到消息 我有以下设置: var redis = require('redis'); var rcPub = redis.createClient(); var rcSub = redis.createClient(); var message = String('testing123'); rcSub.subscribe('redis_channel

我有一个Node.js服务器-我希望进程能够侦听从自身发送的消息-这只是用于测试。我遇到的问题是,当向同一进程发布消息时,订阅者似乎根本没有收到消息

我有以下设置:

var redis = require('redis');

var rcPub = redis.createClient();
var rcSub = redis.createClient();

var message = String('testing123');

rcSub.subscribe('redis_channel@test_overall_health');

rcSub.on('message', function (channel, msgs) {

    console.log(channel,msgs);

});


rcPub.publish('redis_channel@test_overall_health', message);

我有一个redis客户端作为订阅者,一个作为发布者,这是你必须做的,但由于某种原因,消息没有被接收。进程不能侦听其发布的消息是否存在一些限制?这似乎没有道理。我可以验证此代码是否正确,因为侦听同一频道的其他进程收到了消息。

显然,
SUBSCRIBE
命令是在
PUBLISH
命令之后发送的

节点的Redis客户端将命令排队,直到与Redis服务器建立连接,并在套接字上接收到
connect
事件时将排队的命令刷新到服务器。首先启动连接的客户端(发布服务器)很可能首先接收
connect
事件,此时它将发送其排队命令(发布)。由于Redis在单个线程中处理命令,因此订阅者只有在发布命令完成后才能订阅。其他进程能够接收消息,因为它们已经订阅了此通道

在大多数情况下,应首先创建订阅服务器客户端,尽管更安全的方法是在发布任何消息之前等待订阅完成:

var redis = require('redis');

var publisher = redis.createClient(),
    subscriber = redis.createClient(),
    message = 'testing123';

subscriber.subscribe('redis_channel@test_overall_health');

subscriber.on('message', function (channel, message) {
    console.log(channel, message);
});

subscriber.on('subscribe', function (channel, count) {
    publisher.publish('redis_channel@test_overall_health', message);
});

很酷,谢谢,我周一上班时会试试这个:)试试看,你说的似乎是对的,谢谢你弄明白了。我为自己创建的这个问题存在于各种各样的发布/订阅库中,这清楚地表明我在这里是一个新手:)这是一个问题,尽管如此,因为异步库始终具有欺骗性。IMO,subscriber.subscribe应该强制您包含回调,这将消除欺骗。如果您需要一个单独的回调“sub.on('subscribe'),那么您可以自己实现一个EventSemiter,这样会更好。