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:listen,并且laravel-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 组件,在挂载的函数中有一个回声监听器。这是我的组件:

<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 命令时,数据都不会记录到浏览器控制台中。

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

我将我的广播驱动程序更改为我的 redis.env

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为依赖项并不觉得这就是我所要做的。希望这篇笔记有帮助。

编辑:

按照建议,我redis-server在运行 laravel-echo-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
});

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

4

2 回答 2

2

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

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

  1. 事件
  2. 听众
  3. 雷迪斯
  4. Laravel-echo-服务器
  5. 客户

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

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

CHANNEL 用户创建

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

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

于 2017-06-04T06:05:46.043 回答
2

我已经在本地 PC 上设置了您的 GIT 存储库并遇到了问题。

您正在使用一个名为“Chatter”的自定义命名空间,因此您已经在 J​​S 代码中明确定义了它,以便 Echo 可以知道如何找到该 Event 类。

因此,只需在 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

于 2017-06-10T06:37:55.910 回答