当前位置: 首页 > 知识库问答 >
问题:

专用通道不与Laravel echo服务器一起工作

金昂熙
2023-03-14

我在控制台上得到这个JS错误:

app.js:167未捕获的引用错误:未定义接收器ID

这是我的完整代码:

私家车控制员:

event(new PrivateMessageEvent($chat, $receiverId));

PrivateMessageEvent:

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\User;
use App\PrivateChat;

class PrivateMessageEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $privateChat, $receiverId;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(PrivateChat $privateChat, $receiverId)
    {
        $this->privateChat = $privateChat;
        $this->receiverId = $receiverId;
    }

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

Bootstrap.js

import Echo from "laravel-echo"

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

window.Echo.private(`private-chat.${receiverId}`)
    .listen('PrivateMessageEvent', (e) => {
        console.log(e);
});

频道。php

Broadcast::channel('private-chat.{receiverId}', function ($user, $receiverId) {
    return true; // this is just for debugging to allow anyone to listen on this channel
    //return $user->id === $receiverId;
});

拉威尔回声服务器。json

{
    "authHost": "http://localhost",
    "authEndpoint": "/broadcasting/auth",
    "clients": [],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": ""
}

在后台队列中:work和laravel echo服务器已在运行

触发该事件后,我在laravel echo服务器控制台上收到以下消息:

Channel: private-private-chat.
Event: App\Events\PrivateMessageEvent
CHANNEL private-private-chat.

笔记

>

  • 我成功地收听了公共频道。专用频道的唯一问题。

    使用最新的Laravel版本,即5.4

    我已经按照官方文件做了所有的事情:

    https://laravel.com/docs/master/broadcasting

    https://github.com/tlaverdure/laravel-echo-server

    我还提出了关于github回购的问题:

    https://github.com/tlaverdure/laravel-echo-server/issues/158

    我已经花了10多个小时,尽我所能,但没有运气。

    谢啦

  • 共有3个答案

    江迪
    2023-03-14

    尝试代替事件(新的PrivateMessageEvent($chat,$receiverId))

    App\Events\PrivateMessageEvent::dispatch($chat, $receiverId);
    

    淳于思淼
    2023-03-14

    尝试更改此行:

    $this->$receiverId = $receiverId;
    

    关于这一行:

    $this->receiverId = $receiverId;
    

    在PrivateMessageEvent _构造()中

    更新:

    尝试使用使用一个固定的频道id像这样:

    window.Echo.private('private-chat.1')
    

    我建议您也使用状态频道,它们也是私有的,但具有更多功能,即:

    Echo.join('private-chat.1')
       .listen('PrivateMessageEvent', (e) => {
        console.log(e);
    });
    

    如果您使用的dinamic频道号与您使用的相同,即:

    window.Echo.private(`private-chat.${receiverId}`)
    

    你必须在javascript中给RecarverId一个值,这个声明是一个通用的房间侦听器,但是应收ID应该被定义,${RecarverId}是一个字符串插值。

    在导入应用程序之前,可以在模板中定义receiverId。js,例如,使用刀片语法:

    <script>
       receiverId = {{ $receiverId }};
    </script>
    

    另一个想法是:我想明确一点,在上面的所有代码中,接收者ID代表客户端想要加入的聊天/房间的ID,而不是接收用户的ID。

    吕利
    2023-03-14

    您可以将REDIS_PREFIX设置为NULL以删除前缀,否则如果它有值,则必须在echo服务器配置中设置keyPrefix

    如果REDIS\u PREFIX=NULL,则不要添加keyPrefix

    重要通知

    使用broadcastAs()时,对listen(“”)调用的调用必须以点开头

    此时,使用keyPrefix时的行为未知,如果您使用前缀设置,请评论DOT要求的结果。

    https://laravel.com/docs/6.x/broadcasting#broadcast-名字

    public function broadcastAs()
    {
        return 'server.created';
    }
    
    .listen('.server.created', function (e) {
        ....
    });
    

    我会自己检查DOT PREFIX组合,但我觉得如果我再继续工作,Laravel Echo会让我心脏病发作。

    如果不使用broadcastAs(),则命名将回退到事件类名称,在这种情况下没有插入点前缀,请参阅下面的设置:

    拉威尔回声服务器。json

    {
        "host": "127.0.0.1",
        "port": "6001",
        "protocol": "http",
    
        "database": "redis",
    
        "databaseConfig": {
            "redis": {
                "host": "127.0.0.1",
                "port": 6379,
                "db": 0,
                "keyPrefix": "VALUE OF REDIS_PREFIX"
            }
    }
    

    /app/Events/MyExample。php

    php prettyprint-override"><?php
    
    namespace App\Events;
    
    use Illuminate\Broadcasting\PrivateChannel;
    use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
    
    class MyExample implements ShouldBroadcastNow
    {
    
      private $id;
    
      public $payload;
    
      public function __construct($id, $payload)
      {
        $this->id = $id;
        $this->payload = $payload;
      }
    
      public function broadcastOn()
      {
        return new PrivateChannel('example.' . $this->id);
      }
    
    }
    
    

    触发事件(PHP)

    
    use App\Events\MyExample
    
    $payload = [
     'duck' => 'sauce',
     'Bass' => 'Epic'
    ];
    
    event(new MyExample($id, $payload))
    
    

    侦听事件(JavaScript)

    Echo.private(`example.${id}`).listen('MyExample', event => {
    
      console.log('payload', event.payload)
    
    })
    
     类似资料:
    • 我试图将zookeeper和kafka设置为共享名称空间中单独的Kubernetes部署/吊舱。我已经在我的Ubuntu沙盒上通过kubeadm用Calico引导了一个本地K8s 1.8... 所以我假设我的集群中有一个普通的网络问题,然后我注意到一些更让我困惑的事情...如果我将zookeeper.connect设置为10.107.41.148:2181(zookeeper服务的当前地址),连接

    • 我正在为youtube api实现OAuth 2… 公共静态凭据authorize(列表范围,字符串credentialDatastore)引发IOException { } 它在本地工作。从逻辑上讲,我将回调URL更改为http://localhost:8081/CallBack..在本地工作正常,但当我使用公共IP部署到AWS服务器时,它不起作用。 显示地址已被用于8081异常,甚至没有重定向

    • 我试图让机器人在公会中创建一个私人频道,但在JDA留档中找不到任何允许这种情况发生的东西。当调用时返回的ChannelAction在返回()。 目前,我正在努力创建一个文本频道,其中包括: 但我需要一个私人频道。我尝试过编写自己的方法,但它总是需要在JDA GuildController中实现它。JAVA我还研究了,但这是针对用户和机器人之间的DMs,我需要在服务器/公会中使用一个私有通道。 有什

    • 试图调用不存在的方法。尝试是从以下位置进行的: 以下方法不存在: 3.如果您使用kafka版本2.5及以上版本,但却被2021-03-22 13:56:05.102-0400 org{local_sparta}WARN[data-pipeline,,,][DP-ACCOUNT][DPA][]annotationConfigServletWebServerApplicationContext:上下文

    • 我想通过STS在Spring Boot中使用JPA和SQL Server。这是我的表: 马文 application.properties 模型.Account.class 接口账户 ServiceAccount.class 服务帐户类 我在控制器中调用了方法add帐户(),这是我得到的异常 "java.lang.NoClassDefFoundError: org/spingFramework/o

    • 如果你喜欢系统管理员的工作,或者对这方面感兴趣,虚拟或者专用服务器可以让你完全控制自己的生产环境。 nginx 和 PHP-FPM PHP 通过内置的 FastCGI 进程管理器(FPM),可以很好的与轻量级的高性能 web 服务器 nginx 协作使用。nginx 比 Apache 占用更少内存而且可以更好的处理并发请求,这对于并没有太多内存的虚拟服务器尤其重要。 阅读更多 nginx 的内容