Я разрабатываю приложение Laravel с событиями календаря.Laravel socket.io для всех, кроме отправителя
Я использую Socket.io транслировать события (как на уроке здесь: https://laracasts.com/lessons/broadcasting-events-in-laravel-5-1#)
мой socket.js файл:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel', function(err, count) {
//
});
redis.on('message', function(channel, message) {
console.log('Message Received! ' + message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on *:3000');
});
Он отлично работает, но когда событие создается его возвращается к отправителю и дублируется.
Я пытался использовать
socket.broadcast.emit(channel + ':' + message.event, message.data);
вместо
io.emit(channel + ':' + message.event, message.data);
но сокет не определен.
Есть ли способ, которым я могу это сделать без отправки идентификатора отправителя с событием, а затем вручную проверить его в интерфейсе?
Я не понимаю, как это событие повторяется. Вы получаете сообщение от Redis, и вы отправляете его с socket.io. Является ли клиент, отправляющий данные на другой сервер (который вы не предоставили), который публикует Redis? И ваш сервер подписывается на Redis и выдает с socket.io обратно клиентам? – galethil
@galethil назначение создается в представлении календаря (мы используем DayPilot здесь), а затем его данные отправляются через ajax в Laravel. Laravel создает его в базе данных, запускает созданное событие, которое транслируется через redis, и всем, у кого открыт календарь (включая отправителя), когда сообщение получено, DayPilot добавляет встречу в представление. Таким образом, в этом случае в представлении отправителей он дублируется. – viktorasv