【发布时间】:2015-09-03 09:28:33
【问题描述】:
我正在开发带有日历事件的 Laravel 应用程序。
我正在使用 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);
但未定义套接字。
有没有一种方法可以做到这一点,而无需发送带有事件的发件人 ID,然后在前端手动检查它?
【问题讨论】:
-
我不明白事件是如何重复的。您正在接收来自 Redis 的消息,并且您正在使用 socket.io 发送它。客户端是否将数据发送到发布到 Redis 的其他服务器(您没有提供)?而您的服务器正在从 Redis 订阅并使用 socket.io 向客户端发送?
-
@galethil 约会是在日历视图中创建的(我们在这里使用 DayPilot),然后它的数据通过 ajax 发送到 Laravel。 Laravel 在数据库中创建它触发创建的事件,该事件通过 redis 广播,并在收到消息时向所有打开日历视图的人(包括发件人)广播 DayPilot 将约会添加到视图中。所以在这种情况下,在发件人视图中它是重复的。
标签: redis socket.io laravel-5.1