Laravel laravel-echo-server未收到消息(聊天)

时间:2019-09-11 16:23:03

标签: php laravel sockets websocket laravel-echo

我正在尝试设置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时,我看到:

enter image description here

这看起来很棒,当我发送消息时,我看到:

enter image description here

在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');
}

}

“网络”标签中的连接看起来不错:

enter image description here

我的聊天中没有收到任何新消息。使用推杆,它可以工作。我在这里可能做错了什么?谢谢!

3 个答案:

答案 0 :(得分:1)

检查您的 package.json 以确保您已安装 socket.io-client 版本 2.3.0。目前(2021 年 1 月)3.0 版将无法使用,因为我花了很多时间发现。

答案 1 :(得分:0)

在您的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
        });
    });

答案 2 :(得分:0)

尝试在.env文件中添加此行,这解决了我的问题:

REDIS_PREFIX=

Why laravel broadcast channel has a prefix? #28210

相关问题