我正在使用socket.io,express和nodejs创建一个聊天室。到目前为止登录,注销和消息事件都正常工作。但是,访问'用户ID'断开连接的客户端的属性给我一个未定义的错误。我在服务器上存储了一个用户列表,如果离线,则将其状态设置为0.
"use strict";
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/client'));
var server = require('http').createServer(app);
var io = require('./node_modules/socket.io').listen(server);
var users = [];
var messages = [];
io.sockets.on('connection', function(socket) {
// various event functions
socket.on('logout', function(fn){
var username = socket.name;
fn('true');
users[socket.userid].status = 0; // 0: OFFLINE
socket.emit('leave lobby', function(data){
console.log(data);
});
messages.push(
{
id: -1, // -1 indicates a server message
message: username + " left the room"
});
socket.broadcast.to('lobby').emit('user logout', users, messages);
});
socket.on('disconnect', function(){
var username = socket.name;
users[socket.userid].status = 0; // 0: OFFLINE
messages.push(
{
id: -1, // -1 indicates a server message
message: username + " left the room"
});
socket.broadcast.to('lobby').emit('user logout', users, messages);
});
});
正常退出工作正常,但只是退出浏览器会出现此错误:
TypeError: Cannot set property 'status' of undefined
我已经看到了这个问题的其他几个主题,但我发现的解决方案似乎并没有解决这个问题。 (这是使用Express 4.13.3和Socket.io 1.3.6)
答案 0 :(得分:0)
好的,我找到了问题的根源。记录io.sockets.connected表明显然为连接到我的服务器的每个客户端创建了两个套接字。这些套接字中只有一个实际发出事件,因此被分配了用户ID和名称。因为两个套接字同时断开连接,所以如果我尝试访问其userid属性,则第二个套接字会抛出错误。
我仍然需要了解第二个套接字的目的(或弄清楚我是如何意外地创建它),但是现在我通过检查断开连接套接字是否具有用户标识来解决问题在执行其余的注销逻辑之前的属性。
编辑:
问题的根源是我有两个
实例<script src="/socket.io/socket.io.js"></script>
在我的index.html中。叹息...