не могу заставить socket.io работать в облаке9

По какой-то причине я не могу подключиться к socket.io с помощью cloud9.

узел app.js

var express = require('express')
    , app = express()
    , server = require('http').createServer(app)
    , path = require('path')
    , io = require('socket.io').listen(server);

app.configure(function(){
    app.set('domain', process.env.IP);
    app.set('port', process.env.PORT);
    app.use(express.urlencoded());
    app.use(express.json());
    app.use(express.methodOverride());
    app.use(express.compress());
    app.use(express.responseTime());
//    app.use(cors({credentials: false}));
    app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "http://run.plnkr.co");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Credentials", true);
        next();
    });
    app.use(express.static(path.join(__dirname, '/html')));
});


app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
});

// routes
app.use(app.router);

//sockets
io.sockets.on('connection', function(sock){
    console.log('connected!', sock);
    setInterval(function () {
        sock.emit('send:time', {
            time: (new Date()).toString()
        });
    }, 1000);
});

io.sockets.on('error', function(data) {
    console.log('error', data, arguments);
});

// start app
app.listen(app.get('port'));

Клиентская сторона app.js (угловой)

var app = angular.module('plunker', []);

app.controller('MainCtrl', ['$scope', 'socket', function($scope, socket) {
        socket.on('send:version', function (data) {
            $log.log('send:version', data);
            $scope.version = data.version;
        });

        socket.on('send:time', function (data) {
            $log.log('send:time', data);
            $scope.time = data.time;
        });
}]);

app.factory('socket', [
    '$rootScope'
    , '$log'
    , function (
        $rootScope
        , $log
        ) {

        var socket = io.connect('https://demo-project-c9-chovy.c9.io');

        $log.log('socket', io, socket);

        socket.on('connect', function() {
            $log.log('Connected!');
        });

        socket.on('error', function() {
            $log.log('error!', arguments);
        });

        return {
            on: function (eventName, callback) {
                socket.on(eventName, function () {
                    var args = arguments;
                    $rootScope.$apply(function () {
                        callback.apply(socket, args);
                    });
                });
            },
            emit: function (eventName, data, callback) {
                socket.emit(eventName, data, function () {
                    var args = arguments;
                    $rootScope.$apply(function () {
                        if (callback) {
                            callback.apply(socket, args);
                        }
                    });
                })
            }
        };
}]);

Я подозреваю, что проблема в том, что cloud9 использует прокси и не может обслуживать ресурс socket.io/1.

Вот как я подключаюсь из angular:

    var socket = io.connect('https://demo-project-c9-chovy.c9.io');

Если я сделаю это, я получу 404.

Если я использую порт 8080, я в конечном итоге получаю событие ошибки сокета на стороне клиента.


person chovy    schedule 07.12.2013    source источник


Ответы (1)


Мне нужно было server.listen(port, cb) вместо app.listen(port) в файле node app.js.

person chovy    schedule 07.12.2013