【发布时间】:2019-10-23 01:04:16
【问题描述】:
我有一个在 nodejs 中运行的套接字,并在 html 页面中使用这个套接字,这工作正常,有时我在开发者控制台上收到错误,就像 失败:在收到握手响应之前连接已关闭。这次我的更新没有反映在用户屏幕上。实际上,每当在管理屏幕中更新更改时,我都会在 laravel 中写入登录名以将此值存储到 redis 中,并且我使用了 laravel 事件广播,并在节点 js socket.io 中读取 redis 值更改并将值推送到用户屏幕中。 我在laravel中有代码, Laravel 控制器,
public function updatecommoditygroup(Request $request)
{
$request_data = array();
parse_str($request, $request_data);
app('redis')->set("ssahaitrdcommoditydata", json_encode($request_data['commodity']));
event(new SSAHAITRDCommodityUpdates($request_data['commodity']));
}
在上面的这个控制器中,当 api 调用接收到时,只需将值存储到这个 redis 键中并广播事件。 在我的活动课上,
public $updatedata;
public function __construct($updatedata)
{
$this->updatedata = $updatedata;
}
public function broadcastOn()
{
return ['ssahaitrdupdatecommodity'];
}
最后我写了我的socket.io文件,如下所示,
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis({ port: 6379 } );
redis.subscribe('ssahaitrdupdatecommodity', function(err, count) {
});
io.on('connection', function(socket) {
console.log('A client connected');
});
redis.on('pmessage', function(subscribed, channel, data) {
data = JSON.parse(data);
io.emit(channel + ':' + data.event, data.data);
});
redis.on('message', function(channel, message) {
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3001, function(){
console.log('Listening on Port 3001');
});
当我从管理员更新数据时,我将传递给 laravel 控制器,控制器会将接收到的数据存储到 redis 数据库中并传递给事件广播。事件广播将值传递给套接字服务器和套接字服务器推送数据每当 redis 键更改客户端页面时。 在客户端页面中,我编写了如下代码,
<script src="../assets/js/socket.io.js"></script>
var socket = io('http://ip:3001/');
socket.on("novnathupdatecommodity:App\\Events\\NOVNATHCommodityUpdates", function(data){
//received data processing in client
});
大部分时间一切正常,但有时会遇到类似问题
**VM35846 socket.io.js:7 WebSocket connection to 'ws://host:3001/socket.io/?EIO=3&transport=websocket&sid=p8EsriJGGCemaon3ASuh' failed: Connection closed before receiving a handshake response**
由于这个问题,用户页面没有得到新数据的更新。您能否请任何人帮助我解决此问题并为此问题提供最佳解决方案。
【问题讨论】:
标签: node.js laravel redis socket.io