Laravel Echo 无法接收到事件

13
无论出于何种原因,我无法从Laravel Echo接收客户端的任何数据。 我正在使用laravel-echo-server (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-server.json 文件:

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

接下来我运行了php artisan queue:listenlaravel-echo-server start。它们都没有出错。 为了确保服务器工作正常,我执行了php artisan create:user Bob123。 操作成功。队列在控制台返回了这个结果:

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

而laravel-echo-server在控制台中返回了以下内容:

CHANNEL user-created

所以,为了获取我与用户一起发送的数据,我创建了一个Vue组件,并在mounted函数中添加了一个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>

当我刷新网页时,控制台记录了 Component mounted ,因此我确定它已经加载。但是,出于某种原因,当我发送CreateUser命令时,数据未被记录到浏览器的控制台中。

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

我在.env中将广播驱动程序更改为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

我还在app.php配置中取消了BroadcastingServiceProvider的注释。

目前我想不到其他你可能指出我做过的事情,但如果我记得其他的,我会更新问题。

感谢任何帮助。

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

编辑:

如建议所示,我尝试在运行laravel-echo-server之前运行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
});

我把一些我正在测试的东西注释掉了。不确定以后是否需要,所以我只是把它们留在了注释中。如果任何已经注释的代码可能会有帮助,请让我知道。


在启动 Laravel Echo Server 之前,您的 Redis 服务器应该已经启动。 - Nehal Hasnayeen
@NehalHasnayeen,您能详细说明我该如何做吗? - Dastur
首先运行 redis-server,当它启动并运行时再启动 laravel-echo-server - Nehal Hasnayeen
尝试使用 php artisan queue:work --sleep=1 命令,以及查看你的 laravel-echo-server 运行在哪个端口? - Nehal Hasnayeen
只需编写 console.log('test'); 而不是记录数据,然后查看它是否有效。基于此,我可以为您提供更多信息。 - Parth Vora
显示剩余11条评论
2个回答

2
我已在我的本地PC上设置了您的GIT存储库并遇到了问题。
您正在使用一个名为“Chatter”的自定义命名空间,因此您必须在JS代码中明确定义该命名空间,以便Echo可以知道如何找到该事件类。
所以只需在public/js/app.js中将"UserCreated"更改为".Chatter.Events.UserCreated",然后您就可以开始了:
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

2

好的,让我们找到可能出错的部分:

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

  1. 事件
  2. 监听器
  3. Redis
  4. Laravel-echo-Server
  5. 客户端

[2017-06-01 01:28:27] 处理完成:Chatter\Events\UserCreated

事件已成功被监听器(第2步)处理

CHANNEL user-created

事件已写入数据库并被laravel-echo-server接收(第4步)

通常情况下,laravel-echo-server在新用户加入频道时会打印一条消息。我没有在您的代码中看到这些消息,因此laravel-echo-server与客户端之间的连接可能是问题所在。此外,我没有看到任何用JavaScript创建Echo对象的代码。


没错,很奇怪它没有显示用户加入频道的信息,但是关于.user.created,当你使用broadcastAs方法重命名事件时,需要在前面加上一个点。 - Dastur
之前从未使用过 broadcastas,但是在查看官方文档后我发现了前导点。你能否张贴你初始化与服务器连接的 new Echo 代码? - cre8
我在上面修改了我的代码,其中我实例化了Echo。 - Dastur

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