websocket Laravel Broadcasting,如何授权到一个呈现频道?

dfuffjeb  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(77)

我正在尝试加入一个在线状态频道(公共频道工作得很好),但我无法让它工作:

Vue代码:

mounted(){
        Echo.join('game.' + "0").here((users) => {
                alert("In the channel!");
            })
            .joining((user) => {
                console.log("Someone entered");
            })
            .leaving((user) => {
                console.log(user.name);
            })
            .listen('GameEvent', (e) => {
                console.log("Hey")
            });

            Echo.channel('NewSentence')
                .listen('NewSentence',(sentence)=>{
                    alert("HOLA");
                });
    }

字符串
我正在尝试加入通道“game.0”。由于我使用Laravel Passport,我需要使用令牌进行身份验证,并且正在工作。发送Laravel Echo的auth请求返回一个密钥,但JavaScript事件未触发.here().listening()..

BroadcastService提供商 Boot 功能:

public function boot() {
        Broadcast::routes(["middleware" => "auth:api"]);
        require base_path('routes/channels.php');
    }

channel.php

Broadcast::channel('game.0', function ($user,$id) {
   return ['id' => $user->id];

});

验证路径:

Route::post('/broadcasting/auth', function(Request $request){
$pusher = new Pusher\Pusher(
    env('PUSHER_APP_KEY'),
    env('PUSHER_APP_SECRET'),
    env('PUSHER_APP_ID'),
    array(
        'cluster' => env('PUSHER_APP_CLUSTER'),
        'useTLS' => false,
        'host' => '127.0.0.1',
        'port' => 6001,
        'scheme' => 'http',
    )
);

return $pusher->socket_auth($request->request->get('channel_name'),$request->request->get('socket_id'));
});


我是否需要做一些额外的事情来使它工作?这是auth请求:
x1c 0d1x的数据



EDIT:GameEventevent:

class GameEvent implements ShouldBroadcastNow {
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $gameEvent;
    public $gameId;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($gameEvent, $gameId) {
        //
        $this->gameEvent = $gameEvent;
        $this->gameId = $gameId;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\PresenceChannel|array
     */
    public function broadcastOn() {
        //return new PrivateChannel('channel-name');
        return new PresenceChannel('game.0');
    }

    public function broadcastWith() {
        return $this->gameEvent;
    }

}


编辑:
我把名字硬编码了:'game.0'现在被硬编码在routes/channels.php路由中,在Echo连接中和GameEvent中。我还删除了broadcastAs()。进入laravel-websockets调试 Jmeter 板后,我发现我想要订阅的频道甚至没有出现。它看起来不会启动连接,但我不知道它是怎么回事。
我把

uajslkp6

uajslkp61#

这里的问题似乎是Echo没有在正确的频道上收听。首先,Echo.join使用的是频道game.0,其中0是用户的id,我不认为实际上有一个id为0的用户。其次,你正在广播,
GameEvent
并且Echo正在连接到名为game的频道。{id}我建议您从事件文件中删除broadcastAs()函数或侦听GameEvent。还可以使用WebSocket Jmeter 板进行测试。 Jmeter 板将在
/laravel-websockets
自动路由,这只适用于本地环境,因此请确保该环境在您的. env中是本地的。
使用laravel-websockets提供的调试 Jmeter 板将数据发送到通道,首先在 Jmeter 板中连接到您的Web套接字,然后只需输入通道名称,事件名称和JSON格式的数据,并在 Jmeter 板上单击send。x1c 0d1x尝试找出这是否有助于解决您的问题。
我还建议彻底阅读laravel's official documentation on broadcasting以及laravel-websockets debugging dashboard guide。也更新你得到的结果,这个问题。

7kjnsjlb

7kjnsjlb2#

当你使用broadcastAs()时,根据Laravel文档,你需要在Echo.join()中的频道名称之前放一个.

Echo.join('.game.' + "0")

字符串

相关问题