我正在做一个API,它在Heroku上。但是我只在heroku方面遇到了socket.io的一些问题,当我在本地对其进行测试时一切正常。该API完全独立于前端,因此它们位于不同的域(和不同的主机)中。问题是在生产中,我无法成功连接插座…
我有一些问题,所有这些都是关于heroku上的socket.io配置的。我知道有些帖子包含有关此信息的信息,但是我发现这些帖子使用的是旧版本的sockets.io或旧版本的heroku(在过去的7月,heroku似乎改变了websockets的内容):
我不知道在heroku上运行socket.io之前是否需要激活某些内容。我阅读了一些有关此的文章,但似乎都过时了…我尝试使用以下方法激活Websockets:$ heroku labs:enable websockets但是得到的响应是:! No such feature: websockets。
$ heroku labs:enable websockets
! No such feature: websockets
我必须指定一个端口,还是Heroku有一个自动端口?
我需要两个连接吗?一个收听POST / GET / PUT / DELETE,另一个收听套接字?
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); ...
socket-io.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服务(实际上非常好),则需要重新编写代码以使用einaros / ws Websockets实现- 然后通过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);
这应该可以解决您的问题,但是请让我知道日志显示了什么。我认为挂起的是您的应用程序和套接字在两个不同的端口上运行。
创建服务器后,可以使用以下方法监听套接字事件:
io.sockets.on('connection', function(socket) { //'connection' or any other event
希望这可以帮助。