我正在为我正在处理的应用构建实时通知功能。我使用Laravel 5.3,Node,Laravel Echo,Redis和socket.io。
我有我的事件设置,节点服务器侦听端口8888,redis pubsub是与节点工作的连接。后端的一切都在工作。
我的一件事:
class BecaCargada implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $usuario;
public $mensaje;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Usuario $usuario, $mensaje)
{
$this->usuario = $usuario;
$this->mensaje = $mensaje;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new Channel('channel-notificaciones');
}
}
当我生成此事件时,它会被触发并成功发布更改,我可以在redis-cli以及订阅和收听同一频道的nodeJS代码上看到。
是侦听同一频道的nodeJS代码:
require ('dotenv').config();
const server = require('http').Server();
const io = require('socket.io')(server);
const Redis = require('ioredis');
const redis = new Redis();
redis.subscribe('channel-notificaciones');
redis.on('message', function (channel, message) {
const notificacion = JSON.parse(message);
const emmitChannel = `${channel}:${notificacion.event}`;
console.log(`Canal: ${emmitChannel}`);
io.emit(emmitChannel, notificacion.data);
});
server.listen({
host: process.env.NOTIFICACIONES_SOCKET_HOST,
port: process.env.NOTIFICACIONES_SOCKET_PORT
});
对于我的js代码,我现在只有这个:
import Echo from "laravel-echo";
window._ = require('lodash');
window.io = require("socket.io-client");
const echo = window.Echo = new Echo({
broadcaster: 'socket.io',
host: `${process.env.APP_URL}:${process.env.NOTIFICACIONES_SOCKET_PORT}`
});
echo.channel('channel-notificaciones')
.listen('BecaCargada', (e) => {
console.log(e);
});
运行gulp并刷新后,我打开另一个选项卡并触发事件。如果我打开开发工具并查看套接字连接中的框架选项卡,我可以清楚地看到传入事件,channel:EventName,payload。
但是console.log(e)代码在控制台上没有显示任何内容。我已经检查了echo变量,一切似乎都没问题,命名空间,通道。
对可能出错的任何想法?
感谢和快乐的编码=)