Laravel echo 未收到事件

Posted

技术标签:

【中文标题】Laravel echo 未收到事件【英文标题】:Laravel echo not receiving events 【发布时间】:2019-12-22 00:59:48 【问题描述】:

我正在使用 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.4016
Channel: ami_database_private-App.User.4016
Event: App\Events\UpdateRequest

除了我没有在客户端触发事件并且我在 Chrome 开发控制台中什么都没有。我还检查了“WS”部分中的“网络”选项卡,同样没有显示任何内容。

我已经尝试了论坛不同主题上提出的所有解决方案,但没有任何改变

这是我在事件中定义频道的方式(我的班级实现了 ShouldBroadcast):

public function broadcastOn()

    return new PrivateChannel('App.User.' . $this->receiver->id);

这就是我触发事件的方式: 我正在使用 AWS 的 EC2 和 Elasticache

event(new UpdateRequest($receiver));

// I also tried this one
broadcast(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'
        
      
)

我在我的应用程序一开始就调用 echo。这样就永远不会卸载了

echo.private('App.User.' + this.props.userId)
        .listen('UpdateRequest', function (e) 
          console.log('UpdateRequest', e)
        )

编辑:


我忘了给你看 .env 文件:

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

我已经尝试过以下命令:

php artisan queue:work
php artisan queue:listen

我还尝试为我的事件定义一个特定的名称,我将 ShouldBroadcast 接口更改为 ShouldBroadcastNow,我只花了 1 小时检查 Laravel Echo 的源代码,没有任何迹象表明我的做事方式是错误的。

没有错误信息,没有异常,什么都没有。

拜托,我需要帮助,因为我没有想法。

问候!

【问题讨论】:

这可能与您正在使用的事件名称有关。您能否提供您在事件中自定义事件名称的位置?因为如果不是,它可能会使用类的命名空间版本(例如:App\\Events\\UpdateRequest 不,不可能,因为我使用默认的类名作为我的事件名称。我之前出于绝望进行了测试,但由于这不是问题,我停止为我的事件使用自定义名称 您的客户端连接是否经过身份验证? 是的,在客户端,在我看来它已连接。日志表明用户已加入他的私人频道“App.User.4016”,其中 4016 是用户的 ID。早些时候,我检查了所有日志文件以确保没有身份验证错误(因为我使用了护照,但我很好地传递了访问令牌)但什么也没有。我在任何地方都绝对没有错误消息。我的事件在 Redis 上正确写入,laravel-echo-server 检测到该事件,但移动应用程序没有收到任何内容。 【参考方案1】:

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

事实上,我只是没有正确查看 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 不会在其发布事件的频道名称前加上前缀,一切都会恢复正常!

希望对你有帮助!

【讨论】:

你好,bjovanov,我在客户端监听有问题,希望你能帮忙。我确实喜欢你,但没有任何变化:(,这是我的问题***.com/questions/62097109/… 非常好!谢谢朋友)非常有用的注释!【参考方案2】:

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

 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,
 ;

【讨论】:

以上是关于Laravel echo 未收到事件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Echo 没有收到更多事件

Laravel Echo Server 给出错误未处理错误事件:错误:连接 ECONNREFUSED

Laravel Echo 在 Laravel 8-vue js "^2.5.17" 版本中没有收到 Pusher 事件

laravel-echo-server 用户未加入,未订阅套接字服务器

Laravel 事件广播没有被拾取 laravel-echo-server

Laravel Echo 没有收到推送者的通知