无法连接到Heroku上的Websockets

时间:2017-04-14 15:04:02

标签: angularjs node.js heroku laravel-5 websocket

我一直在研究PHP Laravel应用程序,我一直使用Redis和Node.JS连接到WebSocket。

所以为了实现这一点,我一直在尝试在端口3000上运行节点服务器,但是heroku正在动态分配端口。

因此我无法在客户端获得正确的端口号。

我该怎么办才能解决它?

客户端配置:

var socket = io.connect('http://app-around.herokuapp.com:3000');
  Note: Host Name is app-around.herokuapp.com

Backend正在运行正常,如下所示:

    C:\xampp\htdocs\around-us>heroku run node socket.jsRunning node 
   socket.js on app-around... up, run.5567 (Free)
    // Randomly generated port number it is..

   Message Recieved: {"event":"App\\Events\\NewMessage","data":{"data":
    {"message":"Question Posted"}},"socket":null}

因此事件在服务器端生成,但无法在客户端接收它们。在前端尝试了几件事,但没有一件是有效的:

    Eg: 1) var socket = io.connect();
        2) var socket = io.connect(window.location.hostname);

节点服务器代码:

      var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = require('redis').createClient(process.env.REDIS_URL);

redis.subscribe('test-channel', function(err, count) {

});

redis.on('message', function(channel, message) {
   console.log('Message Recieved: ' + message);

    message = JSON.parse(message);

    io.emit(channel + ':' + message.event, message.data);

     var temp = "data";
    io.emit("time", temp);

});

var port = process.env.PORT || 3000;

http.listen(port, function(){
    console.log('Listening on Port 23000');
});

前端的Angular应用程序的JS代码:

var socket = io();

    socket.on("time",function(data){
            alert(data);
    });

3 个答案:

答案 0 :(得分:1)

在Node中,您应该从env vars获取端口:

server.listen(+process.env.PORT || 3000, () => {
    Logger.info(`Listening on port ${process.env.PORT || 3000}...`);
});

在您的io客户端中,您无需指定端口号:

io.connect('http://app-around.herokuapp.com')

答案 1 :(得分:0)

如Andrés所述,服务器应该从环境中收集端口:

开发环境没有PORT变量,因此我们添加了一个默认端口(您正在使用3000,这很常见)。

  process.env.PORT || 3000

客户端 - 我假设是浏览器 - 应该能够使用HTTP URL地址自动识别目标服务器并连接到正确的Websocket URL和端口。

当我不使用预制的库时,我使用以下代码的变体(库通常有自己的URL方案):

// websocket connects to root ("/")
var ws_url =
    document.location.origin.replace(/^http/i, "ws");
// OR web socket connects to full URL path (i.e. "/my/path")
var ws_url =
    document.location.href.replace(/^http/i, "ws");

答案 2 :(得分:0)

我想问题是在你的客户端 var socket = io.connect(' http://app-around.herokuapp.com'); 试试这个或 var socket = io.connect(); 我希望它会对你有所帮助