为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel echo 不接收事件

Laravel echo 不接收事件

PHP
SMILET 2021-11-26 14:59:38
我正在使用 Laravel Echo 和 React Native 在我的移动应用程序中实现实时。我遵循了文档,但无论如何它都不起作用。我使用 Redis 驱动程序广播我的事件,Laravel-echo-server 用于 Socket.io 服务器和 Socket.io-client 在客户端侦听事件。在 Redis 端,一切似乎都运行良好,因为通过“redis-cli monitor”命令,事件写得很好。在 Laravel-echo-server 端,一切看起来也不错,因为当我触发事件时我的日志中有这个(所以我假设用户成功加入了频道):[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016Channel: ami_database_private-App.User.4016Event: App\Events\UpdateRequest除了我没有在客户端触发事件并且我在 Chrome 开发控制台中没有任何内容。我还检查了“WS”部分中的“网络”选项卡,同样,没有显示任何内容。我已经尝试了针对论坛不同主题提出的所有解决方案,但没有任何改变以下是我在事件中定义频道的方式(我的班级实现了 ShouldBroadcast):public function broadcastOn(){    return new PrivateChannel('App.User.' . $this->receiver->id);}这就是我触发事件的方式:我正在使用 AWS 的 EC2 和 Elasticacheevent(new UpdateRequest($receiver));// I also tried this onebroadcast(new UpdateRequest($receiver));这是我在 laravel-echo-server.json 文件中的配置{    "authHost": "<MY_EC2_IP>:80",    "authEndpoint": "/broadcasting/auth",    "clients": [        {            "appId": "<appId>",            "key": "<key_id>"        }    ],    "database": "redis",    "databaseConfig": {        "redis": {            "port": 6379,            "host": "<MY_ELASTICACHE_REDIS_ENDPOINT>"        },        "sqlite": {            "databasePath": "/database/laravel-echo-server.sqlite"        }    },    "devMode": true,    "host": null,    "port": "6001",    "protocol": "http",    "socketio": {},    "secureOptions": 67108864,    "sslCertPath": "",    "sslKeyPath": "",    "sslCertChainPath": "",    "sslPassphrase": "",    "subscribers": {        "http": true,        "redis": true    },    "apiOriginAllow": {        "allowCors": false    }}在客户端,以下是我在 React Native 应用程序中使用 echo 的方式:(我将主机定义为我的 EC2 实例的 IP,因为我在其上运行 Laravel-echo-server)export const echo = new Echo({      broadcaster: 'socket.io',      host: `http://${MY_EC2_IP}:6001`,      client: Socketio,      auth: {        headers: {          Accept: 'application/json'        }      }})
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

我找到了解决我的问题的方法!


事实上,我只是没有正确查看 Laravel-echo-server 发出的日志。


[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016

[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016

Channel: ami_database_private-App.User.4016

Event: App\Events\UpdateRequest

如果仔细观察,我的用户加入了频道,private-App.User.4016因为这部分是由 Laravel Echo 在客户端管理的。


但是如果我们看下面两行,我们会看到当我的事件被触发时,它会在通道上发布,ami_database_private-App.User.4016因为这部分是由 Laravel 管理的,并且默认情况下会为 Redis 条目添加前缀。


只需转到该config/database.php文件并编辑以下代码:


'redis' => [


        // ...


        'options' => [

            'cluster' => env('REDIS_CLUSTER', 'predis'),

            'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',

        ],


        // ...


    ],


'redis' => [


        // ...


        'options' => [

            'cluster' => env('REDIS_CLUSTER', 'predis'),

            'prefix' => '',

        ],


        // ...


    ],

这样,Laravel 就没有在他发布事件的频道名称前加上前缀,一切都恢复正常!


希望能帮助到你 !


查看完整回答
反对 回复 2021-11-26
?
POPMUISE

TA贡献1765条经验 获得超5个赞

您也可以将此前缀添加为 MIX_ 环境变量,或将其添加到前端和后端项目的管道环境中,并将其附加到通道或编写名为 echoListen('channel-name') 的包装函数,该函数返回回声实例。


 const echoPrivate = (channel) => {

  return new Echo({

...options

}).private(process.env.MIX_CHANNEL_PREFIX + channel); 

 };

 

  const echoChannel = (channel) => {

  return new Echo({

...options

}).channel(process.env.MIX_CHANNEL_PREFIX + channel); 

 };

 

 export {

  echoPrivate,

  echoChannel,

 };


查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 258 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信