socket.io-使用命名空间时出现套接字变量问题
socket.io - issue with the socket variable while using namespace
我正在阅读一本书,书中有一段socket.io命名空间的代码片段。书中指定的版本是socket 0.9
下面是一个使用名称空间的简单聊天室的代码。
exports.initialize = function(server) {
io = io.listen(server);
var chatInfra = io.of("/chat_infra")
.on("connection", function(socket) {
socket.on("set_name", function(data) {
socket.set('nickname', data.name, function() {
socket.emit('name_set', data);
socket.send(JSON.stringify({
type: 'serverMessage',
message: 'Welcome to the most interesting ' +
'chat room on earth!'
}));
socket.broadcast.emit('user_entered', data);
});
});
});
var chatCom = io.of("/chat_com")
.on("connection", function(socket) {
socket.on('message', function(message) {
message = JSON.parse(message);
if (message.type == "userMessage") {
socket.get('nickname', function(err, nickname) {
message.username = nickname;
socket.broadcast.send(JSON.stringify(message));
message.type = "myMessage";
socket.send(JSON.stringify(message));
});
}
});
});
}
我正在尝试使用最新的socket版本重新创建代码。但是我在chatCom命名空间中获取socket.nickname
变量时遇到了问题。chatCom命名空间中的socket.nickname变量由于本地作用域而返回undefined。
这是我的版本
exports.initialize = function(server){
io = io(server);
var chatInfra = io.of('/chat_infra');
chatInfra.on('connection',function(socket){
socket.on('set_name',function(data){
socket.nickname = data.name;
console.log(socket.nickname);
socket.emit('name_set',data);
socket.send(JSON.stringify({
type:'serverMessage',
message:'Welcome to the most interesting chat room on earth'
}));
socket.broadcast.emit('user_entered',data);
})
})
var chatCom = io.of('/chat_com');
chatCom.on('connection',function(socket){
socket.on('message',function(message){
message = JSON.parse(message);
if(message.type === 'userMessage'){
message.nickname = socket.nickname;
socket.broadcast.send(JSON.stringify(message));
message.type = 'myMessage';
socket.send(JSON.stringify(message));
}
})
})
}
有没有一种方法可以访问第二个命名空间中的昵称值?我能够在两个命名空间中访问同一个套接字实例。但是,当我从不同的名称空间调用昵称属性时,它似乎被删除了。
console.log 的输出
socket id in /chat_infra is : Zo0kfigUFJOZIgH8AAAB and socket nickname is kj
socket id in /chat_com is : Zo0kfigUFJOZIgH8AAAB and socket nickname is undefine
很抱歉我现在无法亲自验证(也无法发表评论),但希望我能帮你弄清楚。
chatInfra
和chatCom
都应该具有connected
属性,该属性是连接到每个套接字的所有当前套接字的映射。如果套接字没有在每个命名空间中共享/重用,那么它们可能仍然共享相同的连接ID。因此,您可以从chatInfra.connected[socket.id].nickname
中获得昵称。
如果这不起作用,请console.log它们的每个connected
属性并查看它们的差异。另外,socket.io本机处理JSON,因此您不需要JSON.parse和JSON.stringify对象。
您可以将nickname
设置为socket
的client
对象,而不是将nickname
设置为socket
,例如socket.client.nickname = data.name
。
相关文章:
- 如何使用HTML5与UDP套接字通信
- 在node.js中写入ECONNRESET错误和套接字连接检查
- java,javascript签名的小程序(文件选择,ftp上传)安全性/套接字异常
- 套接字服务器向客户端广播,但不从两者接收
- 如何确定套接字中的变量是否匹配
- 如何通过网络套接字连接到树莓派上的Mosquitto经纪人
- 快速的套接字 io 实例/中间件
- PHP:Web套接字和html 5
- Web套接字在分配给全局变量时不起作用
- socket.io-使用命名空间时出现套接字变量问题
- socket.io中的套接字变量有多安全
- 如何使用套接字中的变量.io功能
- 套接字.在Phonegap移动应用程序中未定义的变量
- 套接字.IO唯一变量
- 变量作用域(模块).导出+套接字.io设置)
- node . js /套接字.io“global"变量
- 套接字.io 1.0.5:如何保存会话变量
- 获取套接字.在不同的文件(Express.js)中设置io变量
- 如何在套接字响应后更改 ng 重复变量
- 套接字.Nodejs CoffeeScript在socket.on中获取socket和当前继承的类变量