提问者:小点点

使用beyondcode/laravel WebSocket是否需要推送应用程序/键?


为了在Laravel 8/vue 2.6中实现聊天,我添加了beyondcode/Laravel websockets并阅读了一些手册,我发现我需要使用pusher软件包,比如Laravel echo和pusher js not pusher应用程序API。所以我试着做一个类似的。环境:

BROADCAST_DRIVER=pusher

PUSHER_APP_ID=myId
PUSHER_APP_KEY=myKey
PUSHER_APP_SECRET=mySecret
PUSHER_APP_CLUSTER=eu

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

并在资源/js/bootstrap.js中:

import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'myKey',
    wsHost: 601,
    disableStats: true,
    forceTLS: false
});

在config/app中。php I未注释行:

 App\Providers\BroadcastServiceProvider::class,

在配置/broadcasting.php:

<?php

return [

    'default' => env('BROADCAST_DRIVER', 'null'),

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

                'useTLS' => false,
            ],
        ],
        'ably'   => [
            'driver' => 'ably',
            'key'    => env('ABLY_KEY'),
        ],

        'redis' => [
            'driver'     => 'redis',
            'connection' => 'default',
        ],

        'log' => [
            'driver' => 'log',
        ],

        'null' => [
            'driver' => 'null',
        ],

    ],

];

以及在路线/通道中。php:

Broadcast::channel('chat', function ($user, $id) {
    \Log::info(  varDump($user, ' routes/channels.php -1 $user::') ); // I DO NOT SEE THESE log lines
//    return (int) $user->id === (int) $id;
    return $user;
});

并在配置/websockets.php:

<?php

use BeyondCode\LaravelWebSockets\Dashboard\Http\Middleware\Authorize;

return [

    'dashboard' => [
        'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001),
    ],

    'apps' => [
        [
            'id' => env('PUSHER_APP_ID'),
            'name' => env('APP_NAME'),
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'path' => env('PUSHER_APP_PATH'),
            'capacity' => null,
            'enable_client_messages' => false,
            'enable_statistics' => true,
        ],
    ],

    'app_provider' => BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class,

    'allowed_origins' => [
        //
    ],

    'max_request_size_in_kb' => 250,

    'path' => 'laravel-websockets',

    'middleware' => [
        'web',
        Authorize::class,
    ],

    'statistics' => [
        'model' => \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class,

        'logger' => BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger::class,

        'interval_in_seconds' => 60,

        'delete_statistics_older_than_days' => 60,

        'perform_dns_lookup' => false,
    ],

    'ssl' => [
        'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),

        'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),

        'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),
    ],

    'channel_manager' => \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class,
];

正在运行我看到的服务器:

user@os:app_path$ php artisan websockets:serve
Starting the WebSocket server on port 6001...
New connection opened for app key myKey.
Connection id 447562709.864005085 sending message {"event":"pusher:connection_established","data":"{\"socket_id\":\"447562709.864005085\",\"activity_timeout\":30}"}
...

运行WebSocket仪表板

http://127.0.0.1:8000/laravel-websockets

通过许多信息与成功联系在一起,

但尝试发布新事件时,我看到错误:https://imgur.com/a/7zJZPyu

{"message":"The given data was invalid.","errors":{"data":["The data must be a valid JSON string."]}}

但在brwosers控制台中,我看到错误:

app.js:119179 WebSocket connection to 'ws://0.0.2.89/app/myKey?protocol=7&client=js&version=7.0.3&flash=false' failed:

它与"myKey"失败。也许它的一些选项不使用推送服务器密钥?

谢谢


共1个答案

匿名用户

您需要确保服务器和客户端上的凭据相同。您正在客户端中将键值设置为PUSHER\u APP\u key=myKeyconfig/broadcasting中使用的变量值是多少。php文件和配置/websockets。php键'=

来源:确保使用与广播配置部分相同的应用程序id、密钥和密码。否则,从拉雷维尔广播事件将不起作用。

您还需要确保从调试控制台使用有效的JSON负载。

Source:只需输入通道、事件名称并提供有效的JSON有效负载,即可将其发送到给定通道中所有连接的客户端。