tyrning使用socket.io创建聊天服务器,我收到一个我不明白的错误

时间:2017-02-16 02:40:42

标签: node.js socket.io

我无法弄清楚为什么我的聊天服务器无法正常工作,请查看此错误, 我读到了io.set();不再存在,但我在其中使用了什么?

    "C:\Program Files (x86)\JetBrains\WebStorm 2016.3.3\bin\runnerw.exe" "C:\Program Files\nodejs\node.exe" C:\Users\owner\WebstormProjects\appChat\server.js
Server is running on port 3000...
Option log level is not valid. Please refer to the README.
C:\Users\owner\WebstormProjects\appChat\lib\chat_server.js:15
        guestNumber = assignGuestName(socket, guestNumber, nickNames, namesUsed);
                                      ^

ReferenceError: socket is not defined
    at Namespace.<anonymous> (C:\Users\owner\WebstormProjects\appChat\lib\chat_server.js:15:39)
    at emitOne (events.js:96:13)
    at Namespace.emit (events.js:188:7)
    at Namespace.emit (C:\Users\owner\WebstormProjects\appChat\node_modules\socket.io\lib\namespace.js:209:10)
    at C:\Users\owner\WebstormProjects\appChat\node_modules\socket.io\lib\namespace.js:177:14
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

Process finished with exit code 1

这是使用socket.io

的聊天服务器的代码
 var socketio = require('socket.io');
var io;
var guestNumber = 1;
var nickNames = {};
var namesUsed = [];
var currentRoom = {};

// establishing connection logic
exports.listen = function(server){
    io = socketio.listen(server); //Start Socket.IO server, allowing it to piggyback on existing HTTP server
    io.set('log level', 1);
    io.sockets.on('connection', function(){ //Define how each user connection will be handled
        guestNumber = assignGuestName(socket, guestNumber, nickNames, namesUsed); //Assign a user a guest name when
                                                                                  //they connect
        JoinRoom(socket, 'Lobby');//Place user in lobby room when they connect

        handleMessageBroadcasting(socket, nickNames); //Handle user messages
        handleNameChangeAttempts(socket, nickNames, namesUsed);//name change attempts
        handleRoomJoining(socket); //and room creation/changes

        socket.on('rooms', function(){ //provide user with list of occupied rooms on request
            socket.emit('rooms', io.sockets.manager.rooms);
        });

        handleClientDisconnections(socket, nickNames, namesUsed); //Define clean up logic when user disconnects
    });
};

//assigning a guest name
function assignGuestName(socket, guestNumber, nickNames, namesUsed){
    var name = 'Guest' + guestNumber; //generate new guest name
    nickNames[socket.id] = name; //associate guest name with client connection ID
    socket.emit('nameResult', { //let user know there guest name
        success: true,
        name: name

    });
    namesUsed.push(name);
    return guestNumber + 1; //increment counter used to generate guest names
}

//Joining a room
function JoinRoom(socket, room){
    socket.join(room); //make user join room
    currentRoom[socket.id] = room; //note that user is now in this room
    socket.emit('joinResult', {room: room}); //let user know they are now in new room
    socket.broadcast.to(room).emit('message', { //let other users in room know that user has joined
        text: nickNames[socket.id] + 'has joined ' + room + '.'
    });

    var usersInRoom = io.sockets.clents(room); //Determine what other users are in same room as user
    if(usersInRoom.length > 1){ //if other users exist, summarize who they are
        var usersInRoomSummary = 'users Currently in ' + room + ':';
        for(var index in usersInRoom) {
            var userSocketId = usersInRoom[index].id;
            if (userSocketId != socket.id) {
                if (index > 0) {
                    usersInRoomSummary += ', ';
                }
                usersInRoomSummary += nickNames[userSocket.id];
            }
        }
            usersInRoom += '.';
            socket.emit('message', {text: usersInRoomSummary}); //Send summary of other users in the room to the user
    }
}

//logic to handle name-request attempts
function handleNameChangeAttempts(socket, nickNames, namesUsed){
    socket.on('nameAttempt', function(name){ //Add listener for nameAttempt events
       if(name.indexOf('Guest') == 0) { //Dont allow nicknames to begin withGuest
           socket.emit('nameResult', {
               success: false,
               message: 'Names cannot begin with "Guest".'
           });
       } else{
           if(namesUsed.indexOf(name) == -1) { //If name isn't already registered, register it.
               var previousName = nickNames[socket.id];
               var previousNameIndex = namesUsed.indexOf(previousName);
               namesUsed.push(name);
               nickNames[socket.id] = name;
               delete namesUsed[previousNameIndex]; //Remove previous name to make available to other clients
               socket.emit('nameResult', {
                   success: true,
                   name: name
               });
               socket.broadcast.to(currentRoom[socket.id]).emit('message', {
                   text: previousName + 'is now know as' + name + '.'
               });
           }else{
               socket.emit('nameResult', { // Send error to client if name is already registered
                   success: false,
                   message: 'That name is already in use'
               });
           }
       }
    });
}

//send chat messages
function handleMessageBroadcasting(socket){
    socket.on('message', function(message){
        socket.broadcast.to(message.room).emit('message', {
            text: nickNames(socket.id) + ': ' + message.text
        });
    });
}

// creating rooms
function handleRoomJoining(socket){
    socket.on('join', function(){
        var nameIndex = namesUsed.indexOf(nickNames[socket.id]);
        delete namesUsed[nameIndex];
        delete nickNames[socket.id];
    });
}

//handling user disconnections
function handleClientDisconnections (socket) {
    socket.on('disconnect', function () {
        var nameIndex = namesUsed.indexOf(nickNames[socket.id]);
        delete namesUsed[nameIndex];
        delete nickNames[socket.id];
    });
}

1 个答案:

答案 0 :(得分:2)

改变这个:

class Meal < ActiveRecord::Base
    has_one :xxxxx, dependent: :destroy, autosave: true
    accepts_nested_attributes_for :xxxxx
    # replacing :xxxxx with :dessert_fruit does not work
end

到此:

io.sockets.on('connection', function() {...});

关键是新连接的io.on('connection', function(socket) {...}); 被传递到socket处理程序,您必须声明并使用它才能与新创建的连接进行通信。