Подтвердить что ты не робот

Laravel Echo никогда не получает события

По какой-то причине я не могу получать какие-либо данные на моей стороне клиента из laravel echo. Я использую laravel-echo-server (socket.io), redis broadcaster и redis queues. Насколько я могу судить, все они функциональны. Я расскажу вам, как настроить его для тестирования. Сначала я создал событие 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

Я также раскомментировал BroadcastingServiceProvider в конфигурации app.php.

Я не могу думать ни о чем другом прямо сейчас, чтобы вы могли указать, что я это сделал, но если я вспомню какие-либо другие, я обновлю вопрос.

Спасибо за любую помощь.

Примечание. Я не знаком с Редисом, поэтому в настоящее время я склоняюсь к тому, что это моя проблема. Просто добавив predis\predis, поскольку зависимость просто не похожа на все, что я должен делать. Надеюсь, эта заметка поможет.

Edit:

Как и было предложено, я попытался запустить redis-server, прежде чем запустить laravel-echo-server. Это то, что было возвращено в консоли:

[email protected]:~/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 запущен, поэтому я думаю, что усадьба запускает его автоматически по умолчанию.

Репозиторий 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
});

Прокомментировал некоторые вещи, которые я тестировал. Не был уверен, что мне понадобится снова, поэтому я просто оставил их прокомментированными. Дайте мне знать, действительно ли может быть полезен какой-либо из комментариев.

4b9b3361

Ответ 1

Я установил репозиторий GIT на моем локальном ПК и получил проблему.

Вы используете собственное пространство имен, называемое "Chatter", поэтому вы явно определили, что в вашем JS-коде, чтобы Echo мог знать, как найти этот класс Event.

Итак, просто измените "UserCreated" на ".Chatter.Events.UserCreated" в public/js/app.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

Ответ 2

Хорошо, давайте найдем возможные части, где вы можете ошибаться:

Это очередь, в которой сервер работает через

  • Событие
  • Слушатель
  • Redis
  • Laravel-эхо-сервер
  • Клиент

[2017-06-01 01:28:27] Обработан: Chatter\Events\UserCreated

событие было успешно обработано слушателем (шаг 2)

Созданный пользователем CHANNEL

Событие было записано в базу данных, и сервер laravel-echo получил его (шаг 4)

Обычно laravel-echo-server печатает сообщение, когда новый пользователь присоединяется к каналу. Я не вижу ни одного из этих сообщений в вашем коде, поэтому проблема между laravel-echo-server и клиентом может быть проблемой. Кроме того, я не вижу кода, в котором вы создаете объект Echo на клиенте с помощью Javascript.