我无法弄清楚为什么我的聊天服务器无法正常工作,请查看此错误, 我读到了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];
});
}
答案 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
处理程序,您必须声明并使用它才能与新创建的连接进行通信。