所以,我的插座呼叫什么都不做。致电插座。加入,然后列出套筒所在的房间,插座仅连接到由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' }
如果有所不同,这是我的插座服务器的创建方式:
//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
问题是 socket.join
是异步。因此,这将按预期工作:
socket.join(room, function() {
console.log("Socket now in rooms", socket.rooms);
});
在新版本中,将函数作为第二个参数添加到.join((方法已删除,您可以使用异步等待。
示例
await socket.join(room_Name);
io.to(room_Name).emit(emit_Name);
使用: 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;
}
加入"测试"后,您会看到这样的东西:
AEi6eIlkutIcm_CwAAAB now in rooms test,AEi6eIlkutIcm_CwAAAB
对于使用v3.0的任何人,从socket.io版本3.0中,JOIN不再是异步,上面的代码应该可以正常工作。请参阅此处