Подтвердить что ты не робот

Соединение Socket.io возвращается к опросу, никогда не запускает обработчик соединения

Я пытаюсь добавить socket.io в существующее приложение node.js на express. Я добавил библиотеку socket.io на стороне сервера следующим образом (непосредственно после http://socket.io/get-started/chat/):

var express = require('express')
    , http = require('http')
    , path = require('path')
    , fs = require('fs');

var app = express();
var http = http.Server(app);
var io = require('socket.io')(http);

// Express settings [...]
// Express routes [...]

// Socket.io Communication
io.on('connection', function(socket) {
  console.log('a user connected');
});


// Start server
app.listen(config.port, function () {
  console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

Прямо сейчас, в интерфейсе я просто подключаюсь:

<script src="/socket.io/socket.io.js"></script>
<script>
  var io = io();
</script>

Но вместо того, чтобы показывать "подключенный пользователь" в консоли, консоль регистрирует непрерывный поток опросов. Я использую последнюю версию Chrome на Mac, которая поддерживает websockets.

GET /socket.io/?EIO=2&transport=polling&t=1402521519446-91 200 94ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519447-92 200 93ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519485-93 200 53ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519580-94 200 143ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519582-95 200 144ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519633-96 200 40ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519778-97 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519780-98 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519818-99 200 36ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519912-100 200 81ms - 6.96kb
[etc]

Я должен делать что-то неправильно. Я новичок в этом, и мне бы хотелось, чтобы меня указали в правильном направлении. Дайте мне знать, если мне нужно уточнить любую часть этого вопроса.

Спасибо!  - Эдвард

===========

EDIT:

Здесь экспресс-настройки, которые я сейчас использую. Я пробовал те же шаги в совершенно новом node приложении, и, похоже, он работал нормально, поэтому мне интересно, может ли это быть проблемой.

app.configure('development', function(){
    app.use(require('connect-livereload')());

    // Disable caching of scripts for easier testing
    app.use(function noCache(req, res, next) {
        if (req.url.indexOf('/scripts/') === 0) {
            res.header('Cache-Control', 'no-cache, no-store, must-revalidate');
            res.header('Pragma', 'no-cache');
            res.header('Expires', 0);
        }
        next();
    });

    app.use(express.bodyParser({limit: '50mb'})); // increase limit for audio recordings
    app.use(express.static(path.join(config.root, '.tmp')));
    app.use(express.static(path.join(config.root, 'app')));
    app.use(express.errorHandler());
    app.use(express.logger('dev'));

    util.logger.add(loggly, { 
        [...Credentials...]
    });
    app.set('views', config.root + '/app/views');
});
4b9b3361

Ответ 1

У меня была такая же проблема и как я решил это, заменив это

// Start server
app.listen(config.port, function () {
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

с этим:

// Start server
http.listen(config.port, function () {
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});

Это сообщение объясняет почему: fooobar.com/questions/33228/...

Ответ 2

Я не знаю, если это ваша проблема, но мой глаз застрял в тэге html script, с этим исходным путем js.

<script src="/socket.io/socket.io.js"></script>

Я думаю, что обработка папок неверна. Это должно быть:

<script src="./socket.io/socket.io.js"></script>

Или, может быть:

<script src="socket.io/socket.io.js"></script>

Потому что, по-моему, "/" в начале относится к корневой папке. "./" относится к текущему каталогу и к следующему, но просто имя папки, а затем js внутри должно делать трюк.

Итак, ваш код node прав, но html на стороне клиента не включает ваш script.