javascript - Laravel 事件广播没有被拾取 laravel-echo-server
问题描述
我正在尝试使用 laravel-echo-server (socket.io) 我遇到了一个障碍,客户端似乎没有收到任何广播事件。
一切似乎都连接得很好,socket.io 服务器报告它正在连接并授权用户但是当我广播一条消息时似乎什么也没发生。该事件出现在 Laravel Horizon 上,但除此之外,什么也没有发生。这是我的代码:
server.js 运行 laravel-echo-server:
require('dotenv').config();
const env = process.env;
require('laravel-echo-server').run({
authHost: env.APP_URL,
devMode: env.APP_DEBUG,
database: "redis",
databaseConfig: {
redis: {
host: env.REDIS_HOST_PUBLIC,
port: env.REDIS_PORT,
}
}
});
我在 channel.php 中的频道
Broadcast::channel('message.pushed', function () {
return true;
});
我的活动:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class MessagePushed implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $message;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
$this->message = "My New Message";
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('message.pushed');
}
}
我在 app.js 中的事件监听器
import Echo from 'laravel-echo';
window.io = require('socket.io-client');
if (typeof io !== 'undefined') {
var token = $('meta[name="_token"]').attr('content')
window.Echo = new Echo({
auth : {
headers: {
Authorization: `Bearer ${token}`,
},
},
broadcaster: 'socket.io',
host : window.location.hostname + ':6001',
});
}
function listenForBroadcast() {
Echo.private('message.pushed')
.listen('MessagePushed', (e) => {
console.log(e)
console.log("Listened")
});
}
listenForBroadcast();
最后是发送消息的路由:
Route::get('/event-test', function () {
broadcast(new App\Events\MessagePushed());
});
我不太确定我哪里出错了,或者为什么客户没有收到任何东西。
在 laravel-echo-server 中查看时,命令行正在回显:
Channel: laravel_database_private-message.pushed
Event: App\Events\MessagePushed
解决方案
在您的浏览器中,您需要像 redis 显示的那样在 Channel 上监听,并且还需要像 redis 显示的那样监听事件,因此更改您的 listenForBroadcast() 方法可能会有所帮助。在代码中,频道名称从 message.pushed 更改为 laravel_database_private-message.pushed,事件名称从 MessagePushed 更改为 .App\Events\MessagePushed (不要错过 App 的点前缀)
function listenForBroadcast() {
Echo.private('laravel_database_private-message.pushed')
.listen('.App\\Events\\MessagePushed', (e) => {
console.log(e)
console.log("Listened")
});
}
我根据以下链接中给出的解决方案尝试了这个解决方案,它对我 有用 laravel Echo 不收听频道和事件
推荐阅读
- python - 计算唯一的日期数以计算出现次数
- azure-webjobssdk - 如何在 Azure Webjob V3 中配置 TimerTrigger?
- r - 如何在 R 中最舒服地加载 .dta(保留标签)?
- c# - AngleSharp - 字典的 HTML 属性
- visual-studio-code - VSCode:如何让 Beautify 和 Emmet 在 .tpl 文件上运行(Smarty)?
- php - 在 PHP 中通过 CustomTranslator API 导入文档
- angular - Angular Mat-expansion-panel:选择复选框时,面板被展开并且存在的内容向上移动(附截图)?
- reactjs - React 在 Render-Prop 模式中卸载基础组件
- java - 未显示精细级别的消息
- arrays - 过滤的对象数组,nuxt,vue js