socket.io不能调用未定义的方法“emit”(使用node.js和express,jade)

我正在跟着那个有点老的聊天的例子,但是我从这开始。

但是,所有在该页面中描述的工作后,我得到错误如下:

TypeError: Cannot call method 'emit' of undefined at /Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:109:29 at Array.forEach (native) at userJoined (/Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:108:33) at Socket.<anonymous> (/Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:62:7) at Socket.EventEmitter.emit (events.js:98:17) at Socket.onevent (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/socket.js:330:8) at Socket.onpacket (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/socket.js:290:12) at Client.ondecoded (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/client.js:193:14) at Decoder.Emitter.emit (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20) at Decoder.add (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/node_modules/socket.io-parser/index.js:247:12) 

源代码的问题部分是

 function userJoined(uName) { Object.keys(socketsOfClients).forEach(function(sId){ io.sockets.sockets[sId].emit('userJoined ', {'userName' : uName}); }); } 

所以我跟踪对象io.sockects和我在屏幕上得到的是下面

 { name: '/', server: { nsps: { '/': [Circular] }, _path: '/socket.io', _serveClient: true, _adapter: [Function: Adapter], _origins: '*:*', sockets: [Circular], eio: { clients: [Object], clientsCount: 1, pingTimeout: 60000, pingInterval: 25000, upgradeTimeout: 10000, maxHttpBufferSize: 100000000, transports: [Object], allowUpgrades: true, allowRequest: [Function], cookie: 'io', ws: [Object], _events: [Object] }, httpServer: { domain: null, _events: [Object], _maxListeners: 10, _connections: 7, connections: [Getter/Setter], _handle: [Object], _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000, _connectionKey: '4:0.0.0.0:3000' }, engine: { clients: [Object], clientsCount: 1, pingTimeout: 60000, pingInterval: 25000, upgradeTimeout: 10000, maxHttpBufferSize: 100000000, transports: [Object], allowUpgrades: true, allowRequest: [Function], cookie: 'io', ws: [Object], _events: [Object] } }, sockets: [ { nsp: [Circular], server: [Object], adapter: [Object], id: 'AmJ6dbF_Y_Kus1tcAAAB', client: [Object], conn: [Object], rooms: [Object], acks: {}, connected: true, disconnected: false, handshake: [Object], _events: [Object] } ], connected: { AmJ6dbF_Y_Kus1tcAAAB: { nsp: [Circular], server: [Object], adapter: [Object], id: 'AmJ6dbF_Y_Kus1tcAAAB', client: [Object], conn: [Object], rooms: [Object], acks: {}, connected: true, disconnected: false, handshake: [Object], _events: [Object] } }, fns: [], ids: 0, acks: {}, adapter: { nsp: [Circular], rooms: { AmJ6dbF_Y_Kus1tcAAAB: [Object] }, sids: { AmJ6dbF_Y_Kus1tcAAAB: [Object] }, encoder: {} }, _events: { connection: [Function] } } 

我完全理解为什么我不能得到io.sockets.sockets[sId] ,因为io.sockets.sockets没有密钥。

为了修复这个结构,我应该在connection事件上做额外的工作吗? 我现在的连接处理程序是

 io.sockets.on('connection', function(socket){ socket.on('set username', function(userName){ if (clients[userName] === undefined) { clients[userName] = socket.id; socketsOfClients[socket.id] = userName; userNameAvailable(socket.id, userName); userJoined(userName); } else { if (clients[userName] == socket.id) { } else { userNameAlreadyInUse(socket.id, userName); } } }); } 

谢谢 !

这是socket.io io.to('socket id').emit('some event')新版本io.to('socket id').emit('some event')

那篇博文太多年了..

看看更新的聊天演示:

http://socket.io/get-started/chat/

而且,你可以在这里下载源代码:

https://github.com/rauchg/chat-example