Node.js socket.io未发送到所有客户端

Node.js socket.io未发送到所有客户端,node.js,heroku,socket.io,Node.js,Heroku,Socket.io,我遇到了一个奇怪的问题,在我的生产环境中,只有在本地测试中一切正常,socket.emit工作正常,但io.emit工作不正常。换句话说,每个单独的套接字客户机连接都可以向服务器发送和接收消息,但是当服务器向所有客户机发送消息时,它们都不会接收消息。这很奇怪,因为它可以看到所有客户端-如果我选中Object.keysio.engine.clients,我会看到所有连接的客户端的ID。但是io.emit不会向任何人广播 我使用的是node 7.7.4和socket.io 1.7.3的最新版本。我在

我遇到了一个奇怪的问题,在我的生产环境中,只有在本地测试中一切正常,socket.emit工作正常,但io.emit工作不正常。换句话说,每个单独的套接字客户机连接都可以向服务器发送和接收消息,但是当服务器向所有客户机发送消息时,它们都不会接收消息。这很奇怪,因为它可以看到所有客户端-如果我选中Object.keysio.engine.clients,我会看到所有连接的客户端的ID。但是io.emit不会向任何人广播

我使用的是node 7.7.4和socket.io 1.7.3的最新版本。我在Heroku上托管,并启用了粘性会话。我使用集群以便使用所有CPU,并且我设置了一个redis服务来同步所有工作进程。所有这些基础设施似乎都运转良好

为什么socket.emit适用于任何给定的套接字,但其他方法都不适用

socket.on('sendChat', function(messageBundle) {
    console.log('sockets: ' + Object.keys(io.engine.clients)) //shows clients
    io.sockets.emit('incomingChat', messageBundle); //nothing
    io.emit('incomingChat', messageBundle); //also nothing
    var clients = Object.keys(io.engine.clients);
    for (var i = 0; i < clients.length; i++) {
        console.log('broadcasting to: ' + clients[i]);
        socket.broadcast.to(clients[i]).emit('incomingChat', messageBundle); //still nothing
    }
    socket.emit('incomingChat', messageBundle); //this works though
});

io在开始时未声明,然后您尝试在else语句中重新声明它。

对我来说,问题是socket.io版本不匹配,reddis适配器将socket io升级到3.0.1,redis适配器保持在5.x.x
升级到6.0.1解决了这个问题

我无法重现您的问题,一切正常。你能展示更多的代码吗?特别是在你定义io和SocketHanks的地方——我已经用io和socket定义的信息更新了这个问题。
var redis = require('redis');
var pub = redis.createClient(redisPort, redisHost, {
    auth_pass: redisPwd
});
var sub = redis.createClient(redisPort, redisHost, {
    detect_buffers: true,
    auth_pass: redisPwd
});
var adapter = require('socket.io-redis');
io.adapter(adapter({
    pubClient: pub,
    subClient: sub
}));

var cluster = require('cluster');
var WORKERS = process.env.WEB_CONCURRENCY || 3;
if (cluster.isMaster) {
    for (var i = 0; i < WORKERS; ++i)
        console.log('forking process ' + i);
    cluster.fork();
} else {
    var express = require('express');
    var session = require('express-session');
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io').listen(server);

    var port = process.env.PORT || 5000;
    server.listen(port, function() {
        console.log("Listening on " + port);
        console.log("testing");
    });

    var mySession = session({...}) //this enables me to authenticate the socket using the same session middleware as the express routes

    io.use(function(socket, next) {
        mySession(socket.handshake, {}, next);
    });

    io.on('connection', function(socket) {
        socket.emit('welcome');
        console.log('socket connection');

        socket.on(... etc.)
   ...})
...})
var socket = io({
    reconnection: true,
    reconnectionDelay: 100,
});