Laravel laravel-echo-server не получает сообщения (чат)

Я пытаюсь настроить laravel-echo-server, но не могу его получить работать. При той же настройке (я использую Vue.js) он работает с pusher. Я создал чат.

Мой laravel-echo-server.json выглядит так:

{
    "authHost": "https://sayhidog.test",
    "authEndpoint": "/broadcasting/auth",
    "clients": [],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {}
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "https",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "/Users/lars/.config/valet/Certificates/sayhidog.test.crt",
    "sslKeyPath": "/Users/lars/.config/valet/Certificates/sayhidog.test.key",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}

Когда я бегу laravel-echo-server start, я вижу:

введите здесь описание изображения

Это выглядит здорово, когда я отправляю сообщение, я вижу:

введите здесь описание изображения

В vue.js я подключаюсь так:

window.io = require('socket.io-client');

    if (typeof io !== 'undefined') {
        window.Echo = new Echo({
            broadcaster: 'socket.io',
            host: window.location.hostname + ':6001',
        });
    }

А я слушаю так:

window.Echo.private('chat')
    .listen('MessageSent', (e) => {
        this.messages.push({
            body: e.message.body,
            user: e.user
        });
    });

Мой файл channels.php выглядит так:

Broadcast::channel('chat', function ($user) {
    return true;
});

В моем контроллере я транслирую:

broadcast(new MessageSent($user, $message))->toOthers();

MessageSent выглядит так:

class MessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
/**
 * User that sent the message
 *
 * @var User
 */
public $user;

/**
 * Message details
 *
 * @var ChatMessage
 */
public $message;

/**
 * Create a new event instance.
 *
 * @param User $user
 * @param ChatMessage $message
 */
public function __construct(User $user, ChatMessage $message)
{
    $this->user = $user;
    $this->message = $message;
}

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PrivateChannel('chat');
}

}

Соединение на моей вкладке сети выглядит нормально:

введите здесь описание изображения

Я не получаю новых сообщений в чате. С толкателем работает. Что я здесь делаю не так? Спасибо!


person Jenssen    schedule 11.09.2019    source источник
comment
вы можете поделиться кодом vuejs для прослушивания канала чата?   -  person Ahmed Atoui    schedule 11.09.2019
comment
@AhmedAtoui Я обновил свой вопрос :)   -  person Jenssen    schedule 11.09.2019
comment
вы хотите использовать pusher или socket.io ?, поскольку я вижу, что вы хотите подключиться к pusher, но в коде vue вы используете socketIo lib!   -  person Ahmed Atoui    schedule 11.09.2019
comment
@AhmedAtoui Я использовал pusher сейчас, я хочу использовать socket.io, но это не работает   -  person Jenssen    schedule 11.09.2019
comment
проверь мой ответ   -  person Ahmed Atoui    schedule 11.09.2019


Ответы (3)


Сначала определите метод на вашем канале MessageSent с именем broadcastAs, и он вернет настраиваемое имя следующим образом:

public function broadcastAs()
{
    return 'message.sent';
}

затем прослушайте это событие с произвольным именем, которое вы выбрали, и добавьте точку (.) следующим образом:

window.Echo.private('chat')
    .listen('.message.sent', (e) => {
        this.messages.push({
            body: e.message.body,
            user: e.user
        });
    });
person Ahmed Atoui    schedule 11.09.2019
comment
Спасибо за помощь. Когда я добавлю это, я все равно не получу никаких сообщений. @AhmedAtoui - person Jenssen; 11.09.2019

Попробуйте добавить эту строку в файл .env, это решило мою проблему:

REDIS_PREFIX=

Почему у широковещательного канала laravel есть префикс? # 28210

person Adam Dyderski    schedule 14.12.2019

Проверьте свой package.json, чтобы убедиться, что у вас установлен socket.io-client версии 2.3.0. В настоящее время (январь 2021 г.) версия 3.0 не будет работать, как я обнаружил много часов.

person saswanb    schedule 07.01.2021