У меня есть сокет, работающий в 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**
По этой проблеме пользовательская страница не получает обновления с новыми данными. Не могли бы вы, пожалуйста, кто-нибудь помочь мне решить эту проблему и дать лучшее решение для этой проблемы.