Laravel使用Pusher进行广播出现错误:(未捕获的选项对象必须提供一个集群)

7
我一直在尝试使用Pusher设置广播系统,并按照文档逐步操作。但是当我启动服务器时,控制台会显示以下错误信息:

"Uncaught Options object must provide a cluster"

请帮忙解决。

'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
                'port' => env('PUSHER_PORT', 443),
                'scheme' => env('PUSHER_SCHEME', 'https'),
                'encrypted' => true,
                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
              
            ],
            'client_options' => [
                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
            ],
        ],


我检查了广播配置中的选项对象,发现我的配置中没有集群选项,所以我手动添加了它,但仍然出现了错误。

.env

PUSHER_APP_ID=1529400
PUSHER_APP_KEY=521a8d3a78ab50e2c14d
PUSHER_APP_SECRET=ce93e12b5f74f8280624
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
e here

broadcast.php



'connections' => [

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
                'port' => env('PUSHER_PORT', 443),
                'scheme' => env('PUSHER_SCHEME', 'https'),
                'encrypted' => true,
                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
                'cluster' => env('PUSHER_APP_CLUSTER'),
            ],
            'client_options' => [
                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
            ],
        ],


3个回答

14
我遇到了相同的错误,并通过将cluster添加到传递给新的Echo实例的参数中解决了它: bootstrap.js: 添加了cluster:import.meta.env.VITE_PUSHER_APP_CLUSTER,
import Echo from 'laravel-echo';

import Pusher from 'pusher-js';
window.Pusher = Pusher;
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
    wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
    wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
    forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
    enabledTransports: ['ws', 'wss'],
    disableStats: true,
    cluster:import.meta.env.VITE_PUSHER_APP_CLUSTER,//added this line
});

另外,请确保将其添加到broadcasting.php文件的选项数组中:
 'connections' => [

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'encrypted' => true,
                'host' => '127.0.0.1',
                'port' => 6001,
                'scheme' => 'http'
            ],
            'client_options' => [
                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
            ],
        ],
...

从8.0.0版本开始,集群选项是必需的。另一个问题是,如果您将Laravel-WebSockets包作为推送器的替代品使用,那么在生产环境中,推送器将连接到您在选项中提供的集群,而不是连接到推送器。因此,我所做的是卸载pusher-js 8.0.0版本,并安装不需要集群的pusher 7.6版本:npm i pusher-js@7.6.0

这个方法确实有效。 - Prem Kurian Philip
谢谢您提供有关 Laravel-Websockets 的信息。我在 Laravel 和 Laravel-Websockets 上都按照步骤操作了,但无法使其工作。当我将pusher软件包降级到7.6时,它终于起作用了! - Wilson Wang
将 Pusher 降级至版本 7.6 可以解决我的问题。命令是 npm install pusher-js@7.6 - fudu

5

在bootstrap.js中执行此操作,对我来说非常有效:

window.Echo = new Echo({
broadcaster: 'pusher',
key: import.meta.env.VITE_ABLY_PUBLIC_KEY,
wsHost: 'realtime-pusher.ably.io',
wsPort: 443,
disableStats: true,
encrypted: true,
cluster: 'eu',

});

在这里您可以选择集群位置: https://pusher.com/docs/channels/miscellaneous/clusters/ 最后无论您放置什么都没有关系。我正在使用ably.com进行套接字通信。


你所说的“do”是什么意思?是指添加吗?替换?追加?前置?修改?修补? - undefined
你说的"At the it"是什么意思(看起来不太理解)? - undefined
请通过编辑(更改)您的答案来回复,而不是仅在评论中回复(但*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 不要 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** "编辑:",“更新:”或类似内容 - 答案应该看起来像是今天写的)。 - undefined

1

Joshua,

我也遇到了同样的问题。

现在推动者们已经强制要求使用 https://github.com/pusher/pusher-js/releases

我正在将我的代码回滚到之前的推动者版本,希望能解决这个问题。


你好 Curt,我已经成功修复了问题,而不必回滚。 我所做的只是在 broadcast.php 文件和 bootstrap.js 文件中手动添加集群位置,对我来说一切都正常工作。之前,我只在 broadcast.php 中添加了它,忘记了引导文件。那就是为什么它没有起作用的原因。 - Joshua Bognet
1
@JoshuaBognet,你能演示一下你是如何解决的吗?我遇到了同样的问题,但是你的评论提供的信息不够。 - Simon Angatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接