Socket.io + NodeJS在Heroku上不起作用

我正在做一个API,它在Heroku上。 但是,我只有在heroku端socket.io有一些问题,当我在本地testing一切顺利。 API是完全独立于前端,所以他们在不同的域(和不同的主机)。 问题是,在生产上,我没有成功地连接sockets…

我有一些问题,所有这些都是关于heroku上的socket.ioconfiguration。 我知道有一些关于这方面的信息的post,但我发现它的post是旧版本的sockets.io或旧版本的heroku(heroku似乎已经改变了过去七月的websockets的东西):

  • 我不知道在heroku上运行socket.io之前是否需要激活一些东西。 我读了一些关于这方面的post,但似乎都是旧的…我试图激活Websockets: $ heroku labs:enable websockets但我得到的回应是: ! No such feature: websockets ! No such feature: websockets

  • 我必须指定一个端口,或者Heroku有一个自动的端口吗?

  • 我需要两个连接吗? 一个听POST / GET / PUT / DELETE和另一个sockets?

app.js

  var express = require('express'); var app = module.exports = express(); var port = process.env.PORT || 5000; var port_s = 3000; var server = require('http').createServer(express); ... app.listen(port); server.listen(port_s); require('./config/socket-io')(app, server, secret); app.post('/user', routes.users.register); ... 

socketsio.js

 module.exports = function(app, server, secret) { var clients = {}; console.log("initiating sockets..."); var sio = require('socket.io').listen(server); sio.sockets.on('connection', function (socket) { clients[socket.id] = socket; console.log("...new connection: "+socket.client.id); socket.emit('identification', { data : socket.client.id }); socket.on('newShoutOut', function(data) { var receptor = data.idTo; var emiter = socket.client.id; //console.log("...new shout out from " +emiter+ " to "+receptor); var elem = findElement(sio.sockets['sockets'], 'id', receptor); sio.sockets.sockets[elem].emit('privateShoutout',{ data : data.data, from : emiter }); }); socket.on('disconnect', function() { //console.log("..."+socket.client.id + " disconnected"); }); }); }; function findElement(arr, propName, propValue) { for (var i=0; i < arr.length; i++) { if (arr[i].id === propValue) return i; }; } 

我再说一遍,一切工作在本地主机上。 我尝试了localhost:5000上的API和localhost:80上的客户端应用程序,并且所有套接字都正常工作。

谢谢。

所以这里有一些东西。 如果你想使用Heroku的Websocket服务(这实际上相当不错),那么你需要重写代码来使用websocket的einaros / ws实现,然后通过heroku命令行添加服务。 https://github.com/einaros/ws/blob/master/doc/ws.md

但是 ,由于您已经将您的应用程序编码为socket.io,因此我将简单地修改您实例化socket.io库的方式:

 var express = require('express'), app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server), server.listen(process.env.PORT || 3000); 

这应该解决您的问题,但让我知道日志显示。 我认为挂断是你的应用程序和你的套接字运行在两个不同的端口。

在创build服务器之后,可以使用以下方法来侦听套接字事件:

 io.sockets.on('connection', function(socket) { //'connection' or any other event 

希望这可以帮助。