TypeError:断开连接时无法读取未定义的属性“ id”

时间:2020-05-15 11:18:40

标签: javascript node.js sockets socket.io

可能是一个愚蠢的错误,但我不知道如何解决。 这是我的服务器端代码。

// Dependencies
var express = require('express');
var http = require('http');
var path = require('path');
var socketIO = require('socket.io');

var app = express();
var server = http.Server(app);
var io = socketIO(server);

app.set('port', 4040);
app.use('/client', express.static(__dirname + '/client'));

app.get('/', function(request, response) {
    response.sendFile(path.join(__dirname, '/client/index.html'));
});

// Starts the server.
server.listen(4040, function() {
    console.log('Starting server on port 4040');
});

// Add the WebSocket handlers
var SOCKET_LIST = {};
var playerNumber = 0;
var started = false;

io.on('connection', function(socket) {
    socket.id = Math.random();
    SOCKET_LIST[socket.id] = socket;

    console.log(socket.id);
    console.log(SOCKET_LIST);
    console.log(Object.keys(SOCKET_LIST));

    socket.on('disconnect', function() {    
        delete SOCKET_LIST[socket.id];
    });
});

当我激活带有节点的服务器并且客户端正确连接服务器时,请打印三个console.log(),其中包括:socket.id,SOCKET_LIST和SOCKET_LIST中的密钥列表以及与socket.id对应的密钥。

问题是,在断开连接时我收到错误消息:

删除SOCKET_LIST [socket.id]; ^

TypeError:无法读取未定义的属性“ id” 在套接字。 (C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ app.js:82:31) 在Socket.emit(events.js:315:20) 在Socket.emit> C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ node_modules \ socket.io \ lib \ socket.js:142:10) 在Socket.onclose(C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ node_modules \ socket.io \ lib \ socket.js:454:8) 在Client.onclose(C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ node_modules \ socket.io \ lib \ client.js:254:24) 在Socket.emit(events.js:327:22) 在Socket.onClose(C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ node_modules \ engine.io \ lib \ socket.js:318:10)> 在Object.onceWrapper(events.js:421:28) 在WebSocket.emit(events.js:315:20) 在WebSocket.Transport.onClose(C:\ Users \ utente \ Desktop \ SistemiOrientatiAdInternet \ Progetto \ node_modules \ engine.io \ lib \ transport.js:127:8)

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

原因是您的套接字断开连接后,它不再存在,并且您无法再访问其ID。您可以尝试将id保存在变量中,以便稍后将其从字典中删除。

socket.id = Math.random();
let socketId = socket.id
SOCKET_LIST[socketId] = socket;

...

socket.on('disconnect', function() {    
  delete SOCKET_LIST[socketId];
});