当前位置: 首页 > 知识库问答 >
问题:

Laravel Echo从未收到事件

呼延升
2023-03-14

无论出于何种原因,我无法从laravel echo接收客户端的任何数据。我使用的是LaravelEcho服务器(socket.io)、redis广播和redis队列。据我所知,它们都是功能性的。我将带您了解如何为测试设置它。首先,我创建了一个UserCreated事件:

class UserCreated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;

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

    public function broadcastOn()
    {
        return new Channel('user-created');
    }

    public function broadcastAs()
    {
        return 'user.created';
    }
}

然后,为了测试此事件,我创建了一个CreateUser命令:

class CreateUser extends Command
{
    protected $signature = 'create:user {username}';

    protected $description = 'Create a new user!';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $user = \Chatter\User::create([
            'name' => $this->argument('username'),
            'email' => uniqid() . '@gmail.com',
            'password' => bcrypt('secret')
        ]);
        event(new \Chatter\Events\UserCreated($user));
    }
}

最后,这是我的laravel echo服务器。json:

{
    "authEndpoint": "/broadcasting/auth",
    "authHost": "chatter.dev",
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "port": "6379",
            "host": "localhost"
        }
    },
    "port": 6001,
    "protocol": "http",
    "sslCertPath": "",
    "sslKeyPath": "",
    "socketio": {}
}

接下来,我运行了php artisan队列:listen,以及laravel echo服务器启动。他们两人都没有出错。为了确保服务器正常工作,我做了phpartisan创建:user Bob123。这是成功的。队列返回了以下消息(在控制台中):

[2017-06-01 01:28:27] Processing: Chatter\Events\UserCreated
[2017-06-01 01:28:27] Processed:  Chatter\Events\UserCreated

laravel echo服务器返回了以下信息(在控制台中):

CHANNEL user-created

因此,为了获取与用户一起发送的数据,我创建了一个Vue组件,在挂载的函数中有一个echo侦听器。以下是我的组件:

<template>
    <div class="container">
        <div class="row">

        </div>
    </div>
</template>

<script>
    export default {
        mounted() {
            console.log('Component mounted.');
            window.Echo.channel('user-created')
                .listen('.user.created', (data) => {
                    console.log(data);
                });
        },

        data(){
            return {
                messages: []
            }
        }
     }
</script>

当我刷新我的网页时,安装的组件被记录到控制台,因此我确定它已加载。但是,无论出于何种原因,当我发送CreateUser命令时,数据都不会记录到浏览器控制台中。

以下是您可能指出的所有内容:

我在中将广播驱动程序更改为redis。环境

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

我还取消了应用程序中BroadcastingServiceProvider的注释。php配置。

我现在想不出还有什么你可能会指出我做过的事,但是如果我还记得其他人,我会更新这个问题。

谢谢你的帮助。

注意:我不熟悉Redis,所以目前我倾向于这是我的问题。简单地添加predis\predis作为依赖项并不是我所要做的全部。希望这封信能有所帮助。

编辑:

正如建议的那样,在运行laravel echo服务器之前,我尝试运行了redis server。这是控制台中返回的内容:

vagrant@homestead:~/Code/Chatter$ redis-server
16342:C 01 Jun 05:45:38.066 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
16342:M 01 Jun 05:45:38.067 * Increased maximum number of open files to 10032 (it was originally set to 1024).
16342:M 01 Jun 05:45:38.067 # Creating Server TCP listening socket *:6379: bind: Address already in use

我假设这意味着redis服务器正在运行,所以我猜homestead默认情况下会自动启动它。

Github存储库:

抱歉花了这么长时间,我个人很忙。下面是这个项目的github仓库的链接。如果有任何关于存储库的问题,请告诉我。

https://github.com/Dastur1970/laravel-echo-test

编辑2:

以防万一有人需要它,这是我用来创建我的Echo实例的代码。

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
    // auth: {
    //     headers: {
    //         'Authorization': 'bf242984230eb684 1076b91e572e5bbcc81a852471364c49'
    //     }
    // },
    // key: '1076b91e572e5bbcc81a852471364c497',
    // csrfToken: token.content
});

注释掉了一些我正在测试的东西。我不知道我是否需要再次,所以我只是留下了他们的评论。让我知道任何注释的代码是否真的有用。

共有2个答案

闻人仲渊
2023-03-14

好吧,让我们找出你可能出错的地方:

这是服务器正在运行的队列

  1. 活动

[2017-06-01 01:28:27]已处理:聊天\事件\用户已创建

监听器成功处理了事件(步骤2)

频道用户创建

事件被写入数据库,laravel-echo-server得到了它(步骤4)

通常,当新用户加入频道时,laravel echo服务器会打印一条消息。我在代码中没有看到这些消息,因此laravel echo服务器和客户端之间的连接可能是问题所在。此外,我没有看到任何代码使用Javascript在客户端上创建Echo对象。

公西飞鸾
2023-03-14

我已经在我的本地电脑上设置了你的GIT repo,并解决了这个问题。

您正在使用一个名为“Chatter”的自定义名称空间,因此在JS代码中明确定义了它,以便Echo能够知道如何查找该事件类。

所以只需在public/js/app中将“UserCreated”改为“.Chatter.Events.UserCreated”。js,你可以走了:

mounted: function mounted() {
        console.log('Component mounted.');
        console.log(window.Echo);
        window.Echo.channel('user-created').listen('.Chatter.Events.UserCreated', function (data) {
            console.log('tester123');
        });
    },

更多信息:https://laravel.com/docs/master/broadcasting#namespaces

 类似资料:
  • 你好我和Gradle和IntelliJ有个问题不知从哪里冒出来。一切都在运转,但有一天它停止运转了。我指的是在IntelliJ中与Gradle的任何互动。我有Spring Boot应用程序Gradle 6.7。当没有的时候。根目录中的gradle目录,一切正常。如果目录存在,我会得到 主类名尚未配置,无法解析 对于gradle build或 未收到测试事件 对于gradle测试。如果我删除. gr

  • 我们正在使用解析存储聊天消息,我们正在使用解析通知。 对于iOS,我们这样做是为了在Parse的安装表中创建条目…它在parse的安装表中创建条目,我认为这是接收通知所必须的。 我没有收到来自解析的通知,我认为这是没有收到通知的原因… 事实是这样的吗? 有谁能帮我走上正路吗? 更新 现在收到通知但仍有些疑虑。我在用户登录时执行此操作。我有放条件,如果用户没有创建,那么只有创建,否则不。我没有把它加

  • 我正在开发一个应用程序,用于连接基于HFP(BluetoothHeadset)协议的蓝牙设备。 蓝牙耳机通过蓝牙HFP发送AT(ACTION\u VENDOR\u SPECIFIC\u headset\u EVENT)指令。我已经成功地建立了设备之间的连接。 我已经写了一个广播接收器,并在舱单上登记了它。 上述接收器适用于广播中提及的所有动作和触发器,但 “android.bluetooth.he

  • 收到请求事件 function onRequest(Request $request,Response $response); 当easySwoole收到任何的HTTP请求时,均会执行该事件。该事件可以对HTTP请求全局拦截。 $sec = new Security(); if($sec->check($request->getRequestParam())){ $response->wri

  • 我的LocalBroadcastManager回调函数不接收消息。有人能告诉我为什么吗? 我尝试在我的三星Galaxy S3 mini(4.1.2-Jelly Bean,API 16)上实现这一点。 SenderClass: 主要活动 编辑:这是清单 显示