Laravel Echo 重复监听 n 次广播事件

标签 laravel redis socket.io vue.js

题目可能有点乱,我尽量解释清楚了。

我已经安装了 laravel-echo-serverredis(用于队列)和 Laravel echo。我只想通过输入发送消息,并为页面上的每个人更新消息提要;本质上是一个聊天室。

一切正常,除了它慢得要命,但我是 Laravel EchoVue 的新手。

如果我发送一条消息,没问题,但是当我发送另一条消息时,我会收到两个回复。发送第三条消息三个响应等等...

我究竟做错了什么?我检查过 socket.io/laravel-echo-server 只连接到 channel 一次,而我的 broadcast 只发送一次(检查队列工作人员它只处理请求),那么它是如何以指数方式重复的?

这是我的app.js:

const chatWindow = new Vue({
    el: '#chatWindow',
    data: {
        messages: []
    },
    methods: {
        sendMessage: function () {
            this.$http.post('/chat', {message: this.message}).then((response) => {
                window.Echo.channel('test-chat-channel')
                    .listen('MessageSent', (event) => {
                        console.log(event.message);
                        // this.messages.push(event.message);
                    });
            }, (response) => {
                // error callback
            });

            this.message = '';
        }
    },
    props: ['message']
});

这是我的聊天 View :

<div id="chatWindow" class="col-sm-7">
    <h1 class="text-center no-top">Chat</h1>
    <div class="chat-window">
        <ul>
            <li v-for="message in messages">@{{ message }}</li>
        </ul>

        <div class="form-group">
            <input title="Send Message" v-model="message" @keyup.enter="sendMessage" class="form-control" placeholder="Send message...">
        </div>
    </div>
</div>

以防万一它们在这里是相关的是我的路线:

Route::post('/chat', function (Request $request) {
    event(new MessageSent($request->message));
});

和我的事件:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class MessageSent implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;

    public $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

    public function broadcastOn()
    {
        return new Channel('test-chat-channel');
    }
}

最佳答案

对于遇到类似问题的任何人:

  • 你有一个单页应用
  • 您已经定义了一个 Echo 监听器
  • 您已启用 Pusher 控制台日志并且只看到收到一个事件
  • 您只看到在 Pusher 调试控制台中触发了一个事件
  • 您在调试控制台中看到正常操作(一个订阅、断开连接等到正确的 channel )
  • 但是每次触发单个事件时,您的监听器都会收到多个事件

这可能是您的 Pusher 连接在加载每个页面时没有被破坏。如果您有一个已在多个页面上注册的全局组件,就会发生这种情况。为了解决这个问题,您可以在主布局组件中注册您的监听器组件,以防止缓存多个监听器。

关于Laravel Echo 重复监听 n 次广播事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40855090/

相关文章:

redis - 获取多组

flask - 使用flask-socketio频繁中断套接字连接

node.js - 乘以 io.on ("connection")

php - 如何在 Laravel 5 中使用我的包

node.js - 我想使用 NodeJS 中的 redis 库在 Redis 中的 hset 特定键中设置 Expiry

php - Laravel 不会在 MAMP 上重新加载 .env 文件

macos - Redis 无法在 macOS Sierra 上运行

javascript - 加载源为 : (socketio) 的 &lt;script&gt; 失败

php - Laravel 显示数据库中的图像

Laravel Passport Vue 组件未发布在正确的路径中