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

时间:2014-10-30 20:53:06

标签: javascript node.js sockets

我有以下代码:

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的方法中,socket是未定义的。在joinGame的方法中,定义了socket。我尝试了几个想法,但问题仍然存在。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您必须重命名2 socket个变量中的一个 - 'connection'的参数或循环中的var

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

varshadowing参数,导致参数无法访问。

这部分是因为var socket不仅存在于for循环内。 JavaScript varfunction - 作用域,其声明hoisted位于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的{​​{3}}向所有客户发送消息。

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