Соединение Socket.io возвращается к опросу, никогда не запускает обработчик соединения
Я пытаюсь добавить socket.io в мое существующее приложение node.js на экспресс. Я добавил библиотеку 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, которая поддерживает веб-сокеты.
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]
Я должен делать что-то не так. Я довольно новичок в этом, и я хотел бы, чтобы меня указали в правильном направлении. Дайте мне знать, если мне нужно уточнить какую-либо часть этого вопроса.
Спасибо! - Эдвард
===========
РЕДАКТИРОВАТЬ:
Вот настройки экспресса, которые я сейчас использую. Я попробовал те же шаги в совершенно новом приложении для узлов, и оно, кажется, работает нормально, поэтому мне интересно, может ли это быть проблемой.
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');
});
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'));
});
Этот пост объясняет почему: /questions/31871431/expressjs-applisten-protiv-serverlisten/31871445#31871445
Я не знаю, если это ваша проблема, но мой взгляд остановился на вашем теге HTML-сценария, с этим исходным путем 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 внутри должны помочь.
Таким образом, ваш код узла верен, но html на стороне клиента не включает ваш скрипт.