我一直在研究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);
});
答案 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(); 我希望它会对你有所帮助