【发布时间】:2015-08-24 05:09:02
【问题描述】:
我正在使用 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)
【问题讨论】:
-
你在哪里设置
userid? -
@mscdex,我在登录时分配了 socket.userid,它被(成功地)用于聊天事件和注销。似乎内置的socket.id在断开连接后可用,我想知道我是否只需要在某处存储socket.ids到用户名的映射
标签: node.js socket.io undefined disconnect