当前位置: 首页 > 面试题库 >

Socket.io + NodeJS在Heroku上不起作用

宗冷勋
2023-03-14
问题内容

我正在做一个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有一个自动端口?

  • 我需要两个连接吗?一个收听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

希望这可以帮助。



 类似资料:
  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke

  • 我在Socket.io的nodejs服务器上遇到了一个与Socket.io相关的问题。问题是与socket.io在iOS8+中的IOS移动浏览器上不起作用。我已经寻找了它,并通过了一些解决方案,但没有奏效。以下是问题链接: https://github.com/automattic/socket.io/issues/976 http://www.codedisqus.com/7yzsqugqge/

  • 我有一个带有Express和Socket.io(Ubuntu18.04)的Nodejs服务器应用程序。在nGinx(1.14)反向代理进入场景之前,它总是工作得很好。nginx服务器运行在Node.js应用程序的不同机器上,每个应用程序都在同一网络中的自己的虚拟机上。 2.1.1版本上的服务器和客户端。 我还尝试删除path选项,并为socket.io东西配置了一个特定的/位置(出于测试目的):

  • 我试图用和构建一个简单的应用程序。 Ive用express Generator生成我的应用程序的skel: 然后我编辑了package.json文件以包含socket.io: 在运行时,so socket.io正在初始化,但似乎没有io.sockets模块。 我运行查看该对象,我得到: 那么sockets方法在哪里呢?无处可去。但是你看,有一个套接字功能: 以防万一,我将发布我的,但我的代码似乎没

  • 问题内容: 我是Socket.IO的100%新手,并且刚刚安装了它。我试图遵循一些示例,并且可以使服务器端运行,但似乎无法使客户端连接。 以下是我的server.js: 这是我的index.html 当我执行node server.js时,它指示socket.io已启动。 当我加载index.html时,出现一行,指出“调试-服务静态/socket.io.js”,但除此之外,没有控制台消息或其他行

  • 据我所知,问题必须与Ngnix反向代理和websockets如何路由有关。服务器对ping请求的答复似乎没有发送到客户端。但我似乎无法确定原因。任何帮助都是非常感谢的。