Javascript 在Node.JS中调用emit时出错

Javascript 在Node.JS中调用emit时出错,javascript,node.js,Javascript,Node.js,我正在编写一个私人聊天示例,在开发过程中,调用emit时出错 以下代码: sockets[users[to]].emit('updateChat' , {user : sockets[socket.id].username , mess : Msg}); 。 产生以下错误: Object #(Object) has no method 'emit' 我的所有代码: var express = require('express'), app = express(), http = requir

我正在编写一个私人聊天示例,在开发过程中,调用emit时出错 以下代码:

sockets[users[to]].emit('updateChat' , {user : sockets[socket.id].username , mess : Msg});
。 产生以下错误:

Object #(Object) has no method 'emit'
我的所有代码:

var express = require('express'),
app = express(),
http = require('http'),
server = http.createServer(app),
io = require('socket.io').listen(server);
server.listen(8080);
var usernames = {};
var rooms     = {};
var username  = '';
var users     = {};
var sockets   = {};

app.get('/' ,function (req , res){
res.sendfile(_dirname + '/test.html');
});

io.sockets.on('connection' , function (socket){

socket.on('adduser' , function (username){
    if(username == '')
        username = 'guest';
    else
        socket.username = username ; 
    usernames[username] = username;

    users[username] = socket.id;
    sockets[socket.id] = {username : username  , socket : socket};
    //console.log(users);
    socket.emit('updateChat','SERVER', username +  ' has connect');
    socket.broadcast.emit('updateChat' , 'SERVER', username + ' has connect');
    socket.emit('listUser' ,usernames, username);
    socket.broadcast.emit('listUser' , usernames ,username);
});

socket.on('sendchat', function(data){
    io.sockets.in(socket.room).emit('updateChat' , socket.username , data);
    //sockets[socket.id]= { username : socket.username , data : data , socket : socket};
});

socket.on('room', function (newRoom){
    //console.log(socket.room);
    rooms[newRoom] = newRoom;
    console.log(rooms);
    //socket.leave(socket.room);
    if(socket.room)
    {   
        socket.leave(socket.room);
        socket.broadcast.to(socket.room).emit('updateChat' , 'SERVER' , socket.username + 'has left the room');
    }
    socket.join(newRoom);
    socket.room = newRoom ;
    socket.emit('updateChat' ,'SERVER','connected');            
    socket.broadcast.to(socket.room).emit('updateChat' , 'SERVER' , socket.username + 'has connect this room');
    //socket.emit('updateRooms',rooms, newRoom);
});

socket.on('privateMsg' , function (to ,Msg){
    sockets[users[to]].emit('updateChat' , {user : sockets[socket.id].username , mess : Msg});
});

socket.on('disconnect',function (){
    delete usernames[socket.username];
    //console.log(usernames);
    socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected');
    socket.emit('listUser' ,usernames, username);
    socket.broadcast.emit('listUser' , usernames ,username);
    if(socket.room)
        socket.leave(socket.room);
});
});
我不知道为什么网络上的一些代码可以用这种方式,但我不能,我也更新了socket io。 请帮我修一下。谢谢。

这一行:

sockets[users[to]].emit(...
相反,需要:

sockets[users[to]].socket.emit(...
因为您将条目存储在套接字中,例如:


正如我的回答所指出的,您必须这样称呼它,因为这就是在套接字中存储数据的方式。sockets[users[to]]包含类似{username:'foo',socket:…}的内容,因此当您调用sockets[users[to]]时,emit会查找类似{username:'foo',emit:…}的对象,这是不对的,因此您需要指定emit实际上是socket属性的一个方法。您需要进行基本调试
sockets[socket.id] = {username : username  , socket : socket}