【发布时间】:2014-09-20 17:34:16
【问题描述】:
我正在做一个 API,它在 Heroku 上。但是我只在heroku方面遇到了socket.io的一些问题,当我在本地测试它时一切正常。 API 完全独立于前端,因此它们位于不同的域(和不同的主机)中。问题是在生产中,我没有成功连接套接字......
我有一些问题,都是关于 heroku 上的 socket.io 配置的。我知道有一些帖子提供了一些相关信息,但我发现的帖子是旧版本的 sockets.io 或旧版本的 heroku(heroku 似乎在过去 7 月改变了 websockets 的东西):
我不知道在heroku 上运行socket.io 之前是否需要激活一些东西。我阅读了一些关于此的帖子,但似乎都过时了...我尝试使用以下方式激活 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 logs然后告诉我你看到了什么?
标签: javascript node.js heroku express socket.io