node.js Socket.io 连接恢复为轮询,从不触发“连接”处理程序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24172909/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Socket.io connection reverts to polling, never fires the 'connection' handler
提问by Edward Sun
I'm trying to add socket.io to my existing node.js app on express. I've added the socket.io library in the server-side as follows (directly following http://socket.io/get-started/chat/):
我正在尝试将 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'));
});
Right now, on the front-end I am simply making a connection:
现在,在前端,我只是建立一个连接:
<script src="/socket.io/socket.io.js"></script>
<script>
var io = io();
</script>
But instead of showing "a user connected" in the console, the console logs a continuous stream of polls. I am using the latest version of Chrome on Mac, which supports websockets.
但是控制台并没有在控制台中显示“已连接用户”,而是记录了连续的轮询流。我在 Mac 上使用最新版本的 Chrome,它支持 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]
I must be doing something wrong. I'm pretty new to this, and I'd love to be pointed in the right direction. Let me know if I need to elaborate on any part of this question.
我一定做错了什么。我对此很陌生,我很乐意被指出正确的方向。如果我需要详细说明这个问题的任何部分,请告诉我。
Thanks! - Edward
谢谢!- 爱德华
===========
============
EDIT:
编辑:
Here's the express settings I'm currently using. I tried the same steps on a completely new node app and it seemed to work fine, so I'm wondering if any of this might be the issue.
这是我目前使用的快速设置。我在一个全新的节点应用程序上尝试了相同的步骤,它似乎工作正常,所以我想知道这是否可能是问题所在。
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');
});
回答by Toni
I had the same problem and the way how I solved it was by replacing this
我遇到了同样的问题,我解决它的方法是替换它
// Start server
app.listen(config.port, function () {
console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});
with this:
有了这个:
// Start server
http.listen(config.port, function () {
console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
});
This post kinda explains why: https://stackoverflow.com/a/17697134/1515130
这篇文章有点解释了原因:https: //stackoverflow.com/a/17697134/1515130

