javascript – Socket.io NodeJS不适用于Heroku

我正在做一个API,它在Heroku上.但是我在socket.io上遇到一些问题只在heroku端,当我在本地测试一切都很顺利. API完全独立于前端,因此它们位于不同的域(和不同的主机).问题是在生产中,我没有成功连接套接字……

我有一些问题,所有这些都是关于heroku上的socket.io配置.我知道有一些帖子提供了一些相关的信息,但我发现的帖子是旧版本的sockets.io或旧版本的heroku(heroku似乎已经改变了过去七月的websockets内容):

>我不知道在heroku上运行socket.io之前是否需要激活一些东西.我读了一些关于它的帖子,但似乎都很老了……我试着激活Websockets:$heroku labs:启用websockets,但我得到的响应是:!没有这样的功能: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上的客户端应用程序,并且所有套接字都正常工作.

谢谢.

解决方法:

所以这里有几件事.如果您想使用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

希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。