socket.join不起作用(socket.io)

所以,我的socket.join调用什么都不做。 在调用socket.join之后,然后列出套接字所在的房间,套接字只连接到由其id(它自己的房间)定义的房间。

function onJoin(room) { console.log("Joining room: " + room); socket.join(room); console.log(socket.id + " now in rooms ", socket.rooms); } 

会打印例如:

 > Joining room: 5aba92759b9ffa9fdf579714d6aa125ddb05cb1172611331775e7a69dab37258 > Q6D4h17DvdOZrbrEAAAC now in rooms { Q6D4h17DvdOZrbrEAAAC: 'Q6D4h17DvdOZrbrEAAAC' } 

如果它有所作为,这里是我的套接字服务器是如何创build的:

 //app.js var app = express(); var http = require('http'); var server = http.Server(app); var io = require('socket.io')(server); var chat = require('./routes/chat/chat')(io); //chat.js module.exports = function(io) { io.sockets.on('connection', function(socket) { socket.on('join', onJoin); ... } 

问题在哪里?

  • Socket.io v1.7.3

使用: io.sockets.adapter.rooms

 function onJoin(room) { console.log("Joining room: " + room); socket.join(room); console.log(socket.id + " now in rooms ", getRoomsByUser(socket.id)); } function getRoomsByUser(id){ let usersRooms = []; let rooms = io.sockets.adapter.rooms; for(let room in rooms){ if(rooms.hasOwnProperty(room)){ let sockets = rooms[room].sockets; if(id in sockets) usersRooms.push(room); } } return usersRooms; } 

join'testing'后,你会看到这样的事情:

 AEi6eIlkutIcm_CwAAAB now in rooms test,AEi6eIlkutIcm_CwAAAB 

问题是, socket.join是asynchronous的。 所以这将按预期工作:

 socket.join(room, function() { console.log("Socket now in rooms", socket.rooms); });