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));
});
}
});
});
}
我正在尝试使用最新的套接字版本重新创建代码。但是我在获取 chatCom 命名空间中的 socket.nickname
变量时遇到了问题。由于本地作用域,chatCom 命名空间 returns 中的 socket.nickname 变量未定义。
这是我的版本
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
属性,它是连接到每个的所有当前套接字的映射。如果每个命名空间中的套接字不是 shared/reused,则它们可能仍然共享相同的连接 ID。因此,您可以从 chatInfra.connected[socket.id].nickname
.
中获取昵称
如果这不起作用,console.log 他们的每个 connected
属性并查看它们的差异。此外,socket.io 本身处理 JSON,因此您不需要 JSON.parse 和 JSON.stringify 您的对象。
我正在关注一本书,其中包含 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));
});
}
});
});
}
我正在尝试使用最新的套接字版本重新创建代码。但是我在获取 chatCom 命名空间中的 socket.nickname
变量时遇到了问题。由于本地作用域,chatCom 命名空间 returns 中的 socket.nickname 变量未定义。
这是我的版本
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
属性,它是连接到每个的所有当前套接字的映射。如果每个命名空间中的套接字不是 shared/reused,则它们可能仍然共享相同的连接 ID。因此,您可以从 chatInfra.connected[socket.id].nickname
.
如果这不起作用,console.log 他们的每个 connected
属性并查看它们的差异。此外,socket.io 本身处理 JSON,因此您不需要 JSON.parse 和 JSON.stringify 您的对象。