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')); }); 

现在,在前端我只是build立一个连接:

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

但不是在控制台上显示“用户连接”,控制台会logging连续的民意调查。 我在Mac上使用最新版本的Chrome,它支持websocket。

 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'); }); 

我有同样的问题,我解决这个问题的方式是取代这个

 // 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')); }); 

这篇文章有点解释了为什么: https : //stackoverflow.com/a/17697134/1515130

我不知道,如果这是你的问题,但我的眼睛卡在你的HTML脚本标签,与js的源path。

 <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不包括你的脚本。