Laravel Echo没有监听

8

我来自委内瑞拉,我在尝试将Laravel Echo与项目集成时遇到了问题,我尝试了很多方法,希望能得到你的帮助。

也许我没有用正确的方法。

我正在尝试使用Socket IO广播事件,因为我正在创业公司工作,很难支付像Pusher这样的服务费用。

我正在尝试创建一个简单的实时聊天应用程序。

以下是我的chatController。

public function index(Request $request){

  $sender=Auth::user()->id;
  $receiver=\App\User::find(2);
  $message=new Message;
  $message->message="Hola, esto es una prueba de eventos";
  $message->user_receiver_id=$receiver->id;
  $message->user_sender_id=Auth::user()->id;
  $message->id_chat=1;
  $message->save();

  event(new \App\Events\sendMessage($message,$receiver));

  return response()->json(["status"=>"ok"]);
}

这个聊天应用程序将消息根据具体的群组(聊天)保存在数据库中。
触发的事件是:
``` class sendMessage implements ShouldBroadcast { use Dispatchable, InteractsWithSockets, SerializesModels; ```
``` ```
/**
 * Create a new event instance.
 *
 * @return void
 */

public $message;
public $user_receiver;

public function __construct(Message $message,User $user_receiver)
{
    $this->message=$message;
    $this->user_receiver=$user_receiver;

}

public function broadcastOn()
{
    \Log::info($this->message->id_chat);

    return new PrivateChannel('chat.1');


}}

我的app.js如下:

require('./bootstrap');
import Echo from "laravel-echo";

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


window.Echo.channel('chat.1')
.listen('sendMessage', e => {
    console.log(e);
});

在初始阶段,我只是想从我的sendMessages事件中获取公共变量,之后我将构建视图。

我运行php artisan listener并运行laravel echo server。

当我发送消息时,laravel echo服务器和listener会发生以下情况:

Laravel echo服务器输出

输入图像描述

我认为该过程工作正常,但我认为客户端存在问题。

因为当我发送消息时,客户端没有任何反应。

抱歉我的英语不好,希望您能帮助我。

8个回答

31

如果你要使用Echo.channel(my-channel),例如,你需要像这样做,注意在事件名称之前需要添加(.),有些原因需要这么做。

Echo.channel(`my-channel`)
.listen('.my-event', (e) => {
    consolec.log(e);
});

这是唯一对我有效的解决方案。 - Saurabh
是的,这也适用于我。但我不知道为什么。 - Hassan Daoud
我不知道为什么,但它运行得非常好,干得好兄弟。 - Rachid Loukili
3
我花了3个小时在这上面,非常感谢。 - Waseem Senjer
我花了两天时间来筛选这个解决方案。它是正确的解决方案。非常感谢你。 - Negar Javadzadeh
这就是为什么你需要将 (.) 添加为你的事件前缀的原因:https://laravel.com/docs/7.x/broadcasting#broadcast-name - Hamid Abbasi

4
我希望有人能找到这篇有用的文章,我也花费了很多时间来解决回声监听我的事件,以下是我解决该问题的方法。我正在使用 Laravel 7 和 Pusher 服务器 4.0。
参见:https://laravel.com/docs/7.x/broadcasting#driver-prerequisites MyEvent.php
public function broadcastOn()
{
    return new Channel('my-channel');
}

public function broadcastAs()
{
    return 'my-event';
}

resources/js/bootstrap.js

 import Echo from 'laravel-echo';

 window.Pusher = require('pusher-js');

 window.Echo = new Echo({
     broadcaster: 'pusher',
     key: process.env.MIX_PUSHER_APP_KEY,
     cluster: process.env.MIX_PUSHER_APP_CLUSTER,
     encrypted:true,
     forceTLS: true
 });

resources/views/your_views.blade.php

Echo.channel(`my-channel`)
.listen('.my-event', (e) => {
    console.log('Test');
});

注意:如果您声明了broadcastAs(),请确保在 .listen() 中格式化的方式与上面的代码相同。

注意:在app.js或bootstrap.js文件更改时,请确保每次运行“npm run dev”。


2
这个问题如果没有完整的源代码和运行中的应用程序,将会很难进行故障排除。
我在这个聊天应用程序中实现了所有三种类型的频道(私有、公共和presence),也许你可以从中得到一些想法。

https://github.com/xparthx/laravel-realtime-chat

谢谢


完美的例子,在 Laravel 9 中仍然适用。谢谢 :) - Connor Nee

2

2

在我的情况下,我使用Redis时注意到我的频道名称有一个前缀projectName_database,Laravel> 5.7会自动为您的频道名称添加前缀,您可以在config / database.php中删除前缀。 希望对某些人有所帮助。


非常感谢,我们遇到了同样的问题。你救了我的一天。 - Radames E. Hernandez
哎呀,这个问题浪费了我一周的时间 :( - Merouane Boucenna

0

你正在 Laravel 上使用 PrivateChannel 进行广播,因此在使用 Echo 连接时需要使用以下内容:

window.Echo.private('chat.1').listen('sendMessage', e => {console.log(e);});

如果您仍然遇到问题,请查看此回复


0

检查 "socket.io-client" 的版本,你需要使用 2.x 而不是 3.x


0

至少有一个其他答案已经使用2.x而不是3.x。请更明显地说明您的帖子提供了哪些额外的见解。请注意,如果您只链接而没有直接在帖子中进行概述,则不被视为您答案的一部分。 - Yunnosch

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