我正在做一个API而且它在Heroku上。但是我在socket.io上遇到一些问题只在heroku端,当我在本地测试一切都很顺利。 API完全独立于前端,因此它们位于不同的域(和不同的主机)。问题是在生产时,我没有成功连接套接字......
我有一些问题,所有这些都是关于heroku上的socket.io配置。我知道有一些帖子提供了一些相关的信息,但我发现它的帖子是旧版本的sockets.io或旧版本的heroku(heroku似乎在7月份改变了websockets的内容):
我不知道在heroku上运行socket.io之前是否需要激活一些东西。我读了一些关于这个的帖子,但似乎都很旧......我尝试用$ heroku labs:enable websockets
激活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);
...
插座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。我尝试了localhost:5000上的API和localhost:80上的客户端应用程序,并且所有套接字都正常工作。
谢谢。
答案 0 :(得分:19)
所以这里有几件事。如果您想使用Heroku的Websocket服务(实际上非常棒),您将需要重新编写代码以使用websockets的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);
这可以解决您的问题,但请告诉我日志显示的内容。我认为挂断的是您的应用程序和套接字在两个不同的端口上运行。
创建服务器后,您可以使用以下命令监听套接字事件:
io.sockets.on('connection', function(socket) { //'connection' or any other event
希望这有帮助。