Не работает join и leave в socket.io node?

server.js

var express = require('express');
var http = require('http');
var path = require('path');
var config = require('config');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var busboyBodyParser = require('busboy-body-parser');
var cookieParser = require('cookie-parser');
var methodOverride = require('method-override');
var errorHandler = require('express-error-handler');
var fs = require('fs');
var connect = require('connect');
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);
var async = require('async');

app.engine('html', require('hogan-express'));

app.set('views', __dirname + '/public');

app.set('view engine', 'html');
app.set('view options', {
    layout: true
});
app.set('layout', 'layout');
app.enable('view cache');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(busboyBodyParser());
app.use(cookieParser());
app.use(methodOverride());

app.use(express.static(path.join(__dirname, 'public')));

if ('development' == app.get('env')) {
    app.use(errorHandler());
    mongoose.connect('mongodb://31.131.22.106/sockets');
}

var sessionMiddleware = session({
    //store: new RedisStore({}),
    secret: "keyboard cat"
});

io.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

app.use(sessionMiddleware);

var sess;

fs.readdir(__dirname + '/routes', function(err, name) {
    name.forEach(function(filename) {
        if (~filename.indexOf('.js')) require(__dirname + '/routes/' + filename)(app, sess);
    })
});

app.get('/', function(req, res) {
    sess = req.session;
    res.render("./public/index");
});

app.get('/session', function(req, res) {
    req.session = sess;
    res.json(req.session);
});

var rooms = [ 'room1', 'room2', 'room3' ];

io.sockets.on('connection', function(client) {

    console.log('- client connected...');
    // models
    var module = require('./modules/socket.js');

    var messageItem = function (who, to, message){
        this.who = who;
        this.to = to;
        this.message = message
    };

    client.emit('rooms', rooms);

    client.on('new user', function(name) {
        client.join('room1');
        module.checkUser(name, function(err, user) {
            client.username = user.name;
            client.id = user._id;
            client.room = user.currentRoom;
            var toRoom = user.name + ' has connected to this room [' + user.currentRoom + ']';
            var messageToRoom = new messageItem(user.name, user.currentRoom, toRoom);
            client.broadcast.to(user.currentRoom).emit('to chat', messageToRoom);
            client.emit('created user', {
                room: user.currentRoom,
                name: user.name
            });
        });
    });

    client.on('message', function(message) {
        var messageToRoom = new messageItem(client.username, client.room, message.message);
        console.log('message to: ', message.room);
        console.log(client.rooms);
        io.in(message.room).emit('to chat', messageToRoom);

        module.saveMessage({id: client.id, name: client.username}, message, function(err, result) {
        });
    });

    client.on('change_room', function(room) {

        client.leave(client.room);
        client.room = room;
        client.join(room);
        console.log(client.rooms);

        var messageToRoom = new messageItem(client.username, client.room,
            client.username + ' left the room [' + client.room +']');
        client.broadcast.to('room1').emit('to chat', messageToRoom);

    });

    client.once('disconnect', function () {
        console.log('- client [' + client.id + '] disconnected!');
    });

});


server.listen(3000, function() {
    console.log('Server listening on port ' + 3000);
});


client (app.js)

.controller('authorizationCtrl', ['$scope', '$state', 'authorization', 'socket', 'storage', function($scope, $state, authorization, socket, storage) {

      $scope.rooms = ['room1', 'room2', 'room3'];
      $scope.messages = [];
      $scope.userRoom = '';
      $scope.userName = '';

      socket.on('connect', function(){
        console.log('[front-end] client connected...');
      });

      //socket.on('rooms', function(rooms) {
      //  $scope.rooms = rooms;
      //});

      socket.on('created user', function(user){
        $scope.userRoom = user.room;
        $scope.userName = user.name;
      });

      socket.on('to chat', function(message){
        console.log(message);
        $scope.messages.push(message);
      });

      $scope.newUser = function() {
        socket.emit('new user', $scope.auth.name);
      };
      // add new message
      $scope.sendMessage = function() {
        var message = {
          message: $scope.message,
          room: $scope.userRoom
        };
        socket.emit('message', message);
      };

      $scope.switchRoom = function(room) {
        $scope.userRoom = room;
        socket.emit('change_room', room);
      };

    }]);


Не работает "change_room" просто всегда сокет в руме 1 (room1) и не меняет, подскажите что не так.
В html есть 3 кнопки соответственно room1, room2, room3 когда кликаю по кнопке идет вызов функции
"switchRoom" и передает туда название комнаты. На сервер все приходит по "client.on -> change_room" но просто не присваивает самому сокету.
  • Вопрос задан
  • 746 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы