我在node.js中收到一条消息,对象套接字未定义

I am receiving a message in node.js and the object socket is undefined

本文关键字:消息 对象 套接字 未定义 一条 node js 我在      更新时间:2023-09-26

我有以下代码:

function Socket(io, playGame, mapper) {
    io.on('connection', function (socket) {
        // message handler for the chat message
        socket.on('sendChat', function (data) {
            console.log(socket);
            console.log(data);
            console.log('recieved chat');
            var connectedPlayer = playGame.findConnectedPlayer(socket);
            if (!connectedPlayer)
                return;
            var connectedGame = playGame.findConnectedGame(socket, connectedPlayer.gameId);
            if (!connectedGame)
                return;
            // send update game with players properly ordered
            for (socketIndex in this.sockets) {
                var socket = this.sockets[socketIndex];
                // send the new data to each player
                socket.socket.emit('chatUpdate', { chatText: data.chat });
            }
        });
        // message handler for join game message
        socket.on('joinGame', function (data) {
            console.log('recieved join:', JSON.stringify(data));
            if (!playGame.newConnectedPlayer(socket, data))
                return;

在sendChat的方法中,套接字是未定义的。在joinGame的方法中,定义了套接字。我尝试了几种想法,但问题依然存在。如有任何帮助,我们将不胜感激。

您必须重命名两个socket变量中的一个——循环中'connection'var的参数:

io.on('connection', function (socket) {
for (socketIndex in this.sockets) {
    var socket = this.sockets[socketIndex];

var正在对参数进行阴影处理,使参数无法访问。

这在一定程度上是因为var socket不仅仅存在于for循环中。JavaScript var的作用域是function,它们的声明被提升到function的顶部,如:

socket.on('sendChat', function (data) {
    var connectedPlayer, connectedGame, socket; // each initially `undefined`
    console.log(socket);
    // ...
    for (socketIndex in this.sockets) {
        socket = this.sockets[socketIndex];
    // ...
});

而且,具有相同的确切名称,从特定的function最多只能访问其中一个。


还要注意,for循环和var socket并不是真正必要的。

可以使用Socket.IO Server自己的.emit()方法向所有客户端发送消息。

io.emit('chatUpdate', { chatText: data.chat });