Heroku和Socket.io,400错误的请求和很多断开连接

所以我有一个应用程序在socket.io上工作,我试图让它在Heroku上工作,但有严重的问题得到它运行。

在控制台日志和chrome控制台中,每隔一秒左右就有一堆断开连接。 在Chrome控制台中,我一直收到400个错误的请求。

https://appname.herokuapp.com/socket.io/?api_key=xxx&EIO=3&transport=polling&t=1424782938420-1&sid=hcTvjdxYePd4kNS5AAAe Failed to load resource: the server responded with a status of 400 (Bad Request) disconnect WebSocket connection to 'wss://appname.herokuapp.com/socket.io/?api_key=xxx=3&transport=websocket&sid=hcTvjdxYePd4kNS5AAAe' failed: WebSocket is closed before the connection is established. 

所以在我的server.js

 var cluster = require('cluster'); var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var redis = require('redis'); var redisAdapter = require('socket.io-redis'); var port = process.env.PORT || 3800; var workers = process.env.WORKERS || require('os').cpus().length; var redisUrl = process.env.REDISTOGO_URL || 'redis://rediscloud:pw@url:14599'; var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); var pub = redis.createClient(redisOptions.port, redisOptions.host, { detect_buffers: true, auth_pass: redisOptions.password }); var sub = redis.createClient(redisOptions.port, redisOptions.host, { detect_buffers: true, auth_pass: redisOptions.password }); io.set('origins', '*:*'); io.adapter(redisAdapter({ pubClient: pub, subClient: sub })); console.log('Redis adapter started with url: ' + redisUrl); /* -------------------------------- */ //APP LOGIC HERE /* -------------------------------- */ if (cluster.isMaster) { console.log('start cluster with %s workers', workers - 1); workers--; for (var i = 0; i < workers; ++i) { var worker = cluster.fork(); console.log('worker %s started.', worker.process.pid); } cluster.on('death', function(worker) { console.log('worker %s died. restart...', worker.process.pid); }); cluster.on('exit', function(worker) { console.log('worker %s exited. restart...', worker.process.pid); cluster.fork(); }); } else { start(); } function start() { http.listen(port, function() { console.log('listening on *:' + port); }); } 

在我的client.html

 <script src="https://appname.herokuapp.com/socket.io/socket.io.js"></script> <script> var socket = io.connect("https://appname.herokuapp.com", { query: "api_key=xxx" }); </script> 

我已经读过,粘滞的会话可能会导致问题,但大部分的信息似乎已经过时了,显然Heroku现在支持websockets。

我不想在多个实例上运行这个,这只是与heroku ps:scale web=1

甚至没有确定的websockets工作,似乎是使用轮询,然后失败了。

所以我的问题:为什么我得到所有这些断开连接和400个错误的请求,当它在当地工作正常? 我该如何解决?

我遇到过同样的问题。 解决scheme是改变主机。 我不想从heroku移动,因为它真的很方便。 但是,当我浪费了很多时间来search修复程序之后,我尝试将应用程序部署到OpenShift。 此外,我添加了修改启动的服务器提供显式端口和主机(不工作没有它!)

 var port = process.env.OPENSHIFT_NODEJS_PORT || 8080, ip_address = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1'; ... sockets.setupListeners(server); server.listen(port, ip_address); 

更详细的信息,你可以在这里find在第4条下input链接描述 。

我相信你会解决你的头痛。