2016-03-21 49 views
0

我尝试了几种尝试向所有连接到特定/命名空间的用户发出变体,但都没有运气。我可能会误解插座的工作方式。Emit()给/ namespace中的所有人 - NodeJS,Socket.IO

但是我现在有两个浏览器在不同的页面上打开。当用户连接到pageA时,该用户现在成为'/ users'命名空间的一部分。当用户连接到pageB时,该用户现在是'/ valets'命名空间的一部分。

我有一个.emit()pageA发送到server.js。我使用.on()来听它,然后尝试运行.emit(),但仅限于'/ valets'命名空间中的用户。

我能够在我的终端中看到“听取请求代理”和console.log(数据)部分。

我相信我的问题是usr_nsp.of('/valets').emit("incoming-request",{data:data});部分。其他评论线是我到目前为止尝试过的。他们都给我一个错误:不是一个函数。

server.js

var app = require('http').createServer(); 
var io = require('socket.io')(app); 
app.listen(3000, function(){ 
    console.log('listening on port 3000'); 
}); 

var redis = require('socket.io/node_modules/redis'); 


// create custom namespace for Users 
var room_number; 
var usr_nsp = io.of('/users'); 
usr_nsp.on('connection', function(socket){ 
    console.log('user has connected to /users namespace'); 

    socket.on('request-valet', function(data){ 

     console.log("listening for request valet"); 
     console.log(data); 
     room_number = data.room_number; 
     socket.join(room_number); 

     // usr_nsp.broadcast.of('/valets').emit("incoming-request",{repark:data}); 
     // usr_nsp.of('/valets').broadcast.emit("incoming-request",{repark:data}); 
     // io.of('/valets').emit("incoming-request",{repark:data}); 
     // socket.of('/valets').emit("incoming-request",{repark:data}); 
     usr_nsp.of('/valets').emit("incoming-request",{repark:data}); 

    }); 


}); 

var valet_nsp = io.of('/valets'); 
valet_nsp.on('connection', function(socket){ 
    console.log('valet has connected to /valets namespace'); 

    // var room_number; 

    socket.on('join-room', function(data){ 
     // assign valet to room 
     room_number = data.room_number; 
     socket.join(room_number); 

     //valet_nsp.sockets.in(room_number).emit("request-accepted",{current_pos:current_pos}) 

    }); 

    socket.on('set-valet-starting-position', function(data){ 

     //var valet_starting_pos = data.starting_position; 
     valet_nsp.sockets.in(room_number).emit('activate-directions-service', {repark:data}); 
    }) 

    socket.on('get-new-location', function(data){ 

     // send the updated location only to User 
     // maybe use .broadcast?? 
     valet_nsp.sockets.in(room_number).emit("update-valet-location", {current_pos:data}); 

    }); 

}); 

pageB.html(插座部分)

socket.on('incoming-request', function(data){ 

     console.log("incoming request"); 
     alert("incoming request"); 

     // use data to display on html screen 


    }); 

回答

1

所创建的命名空间句柄用于emit to users in that particular namespace。这应该因此起作用:

var users = io.of('/users'), 
    valets = io.of('/valets'); 

users.on('connection', function(socket) { 
    socket.on('request-valet', function(data) { 
    valets.emit('incoming-request', { repark : data }); 
    }); 
}); 
+0

感谢您的回应。我试过你的方法,没有错误,但似乎没有听取pageB客户端。没有什么是console.log。 – Chris

+0

@Chris,你已经创建了与'var socket = io('/ valets');'和'var socket = io('/ users');''的客户端连接。我尝试了两个HTML文件和两个命名空间,并且可以放出没有问题。 – vesse

+0

有趣。是的,我在pageA上:var socket = io.connect('http://127.0.0.1:3000/users');'和pageB:'var socket = io.connect('http://127.0。 0.1:3000/valets');'我以前曾尝试过'var socket = io('/ users');'但那不起作用。我需要添加'http:// ...'部分。 – Chris