套接字.io + NodeJS不能在Heroku上工作
Socket.io + NodeJS doesn't work on Heroku
我正在做一个API,它在Heroku上。但是我的插座有点问题。当我在本地测试它时,一切都很好。API完全独立于前端,因此它们位于不同的域(和不同的主机)。问题是,在生产中,我没有成功连接套接字…
我有一些问题,都是关于插座的。heroku上的IO配置。我知道有一些关于这方面的信息的帖子,但我发现它是旧版本的套接字。. io或旧版本的heroku (heroku似乎已经改变了websockets的东西在过去的七月):
-
我不知道我是否需要在运行socket之前激活一些东西。我在这里。我读了一些关于这个的帖子,但似乎都是旧的…我试图激活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的Websocket实现——然后通过Heroku命令行添加服务。https://github.com/einaros/ws/blob/master/doc/ws.md
然而,因为你已经把你的应用程序编码为套接字。io,我将简单地重做如何实例化套接字。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
- gmap4rails在本地工作,但没有;不要出现在heroku上
- 为什么我的下拉菜单在本地服务器上可以工作,但当我推到heroku时却不能
- JQuery 事件不是在生产中处理 heroku,而是在开发中工作
- Nicedit在本地工作,但不是Heroku
- rails 预编译 为什么 javascript 在本地不起作用,但在 heroku 它可以工作
- JavaScript在开发中工作,而不是在生产中工作(Heroku)
- Heroku 生产:Gmaps 未定义 - 在本地工作
- JavaScript 不会在 Heroku 上加载,而是在本地工作
- Sails JS - 显示闪存消息在 Heroku(生产)上不起作用,但在开发中工作正常
- 投票系统在部署到heroku时不工作
- heroku上的后台工作网络是如何知道的's结束了
- Rails 4-Javascript没有'在Heroku部署后无法工作
- 莫代尔没有在heroku上工作;但在本地运行良好
- moment.js的isoWeek不能在Heroku实例上工作
- 套接字.io + NodeJS不能在Heroku上工作
- SSE在Heroku上没有像预期的那样工作
- 单个Javascript函数不能在Heroku上工作
- ruby on rails-Javascript在本地工作,但在部署到Heroku时不再工作.(带涡轮连杆.)
- Rails: jQuery在本地主机上工作,但不能在heroku上生产
- 内联Javascript不是Rails Heroku不工作