【问题标题】:Laravel Echo is not listeningLaravel Echo 没有在听
【发布时间】:2020-08-22 02:10:00
【问题描述】:

我设置了一个活动和新频道:

class TaskCreated implements shouldBroadcast
 {
use Dispatchable, InteractsWithSockets, SerializesModels;
public $task;

public function __construct(Task $task)
{
    $this->task = $task;
}

}

并安装 Echo 并进行设置

 import Echo from "laravel-echo"
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'pusher-key',
    cluster: 'ap2',
    encrypted: true
});

然后我在发布任务时调用 TaskCreated 事件

event(new TaskCreated($task));

但是,问题是 Echo 不听推送日志或任何东西。即使在 laravel-websockets 中,事件是作为 api 消息创建的。

这里是 vue js Echo 实现:

 mounted () {
        axios.get('/tasks').then(response => (this.tasks = response.data));

       Echo.channel('taskCreated').listen('TaskCreated', (e) => {
            console.log(e);
            this.tasks.push(task.body)
        });

在仪表板中:

api-message Channel: taskCreated, Event: App\Events\TaskCreated 19:01:55

更新

现在,当我尝试与 WS 连接时,连接状态等待 10 秒,然后出现错误 WebSocket 在连接建立之前已关闭。 AND 连接建立错误:net::ERR_CERT_AUTHORITY_INVALID。

请求网址:wss://127.0.0.1/app/local?protocol=7&client=js&version=6.0.2&flash=false

import Echo from "laravel-echo"
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
 key: process.env.MIX_PUSHER_APP_KEY,
 wsHost: window.location.hostname,
 wssPort: 6001,
 disableStats: true,
 enabledTransports: ['ws', 'wss']

【问题讨论】:

  • 你能检查一下控制台吗?可能有一些错误。
  • 去掉TaskCreated前面的点。点表示您有一个自定义命名事件。您可以通过在事件类中添加broadcastAs() 函数并返回带有自定义事件名称的字符串来添加自定义名称。
  • @UzairRiaz 控制台中没有错误或日志。网络 - WS 状态为 101
  • DevTools failed to load SourceMap: Could not load content for http://127.0.0.1:8000/js/utf8.js.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE DevTools failed to load SourceMap: Could not load content for chrome-extension://ndjpnladcallmjemlbaebfadecfhkepb/editor/config.js.map: HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME DevTools failed to load SourceMap: Could not load content for chrome-extension://ndjpnladcallmjemlbaebfadecfhkepb/editor/content.js.map: HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME
  • 您能否确认事件是否从后端触发?在 {base_ur}/laravel-websockets 查看 laravel-websockets 仪表板。另外,laravel echo 不断的向wss:{url}ws:{ur} 发送请求,如果不运行php artisan websockets:serve,会在控制台报错所以检查这些错误并将它们发布在这里。您还可以通过将过滤器设置为所有请求来检查这些请求,从而在浏览器开发工具中检查网络。

标签: php laravel vue.js laravel-7 laravel-websockets


【解决方案1】:

正如 Kabelbaan 所说,删除点但转到调试控制台并刷新您的应用程序即可开始。您应该会看到您的任务频道的连接和订阅。如果不这样做,您可以开始调试连接,而不是推送调度事件。另外,我认为复制和粘贴不完整,但您的 window.Echo 语句不完整。

【讨论】:

  • 我删除了点,但还是一样。重新启动了所有服务器(包括 Apache),仍然是同样的事情。 window.Echo 完成!有什么遗漏吗?
  • @leo0019 尝试使用 event(new TaskCreated($task)) 函数,因为这是在 Laravel 官方文档中触发所有事件的方式,或者使用 Event::fire(...)。你能告诉我们channels.php吗?
  • eventbroadcast 对我不起作用。 channel.php 只有一个与任务无关的路由,因为它是一个公共频道
  • laravel-websocket 已经获得 Channel: tasks, Event: App\Events\TaskCreated 但 Echo 没有监听
  • @leo0019 我看到您的频道名称是'tasks',因此请确保在前端也正确更改频道。 Echo.channel('tasks').listen(...)
【解决方案2】:

对于那里的任何人,经过多次尝试后我发现...您必须在您的环境中设置推送器凭据。和广播.js。我在 Laravel 7 上做了很多尝试来设置它而没有凭据(运气不好),否则来自 Google Chrome 和网络请求的许多问题将会崩溃。这是给我的,希望这对你有用

【讨论】:

  • 如果您能给我们一些关于您的意思的线索,那就太好了。我一直在尝试在实时服务器上运行我的 Laravel 7 - Vue 应用程序,即使它可以在 localhost 上运行。
  • 我还没有在实时服务器上测试过
  • 不是最佳格式的答案.. ..但肯定为我解决了这个确切的问题。我从 bootstrap.js 中删除了 process.env.MIX_PUSHER_APP_KEYprocess.env.MIX_PUSHER_APP_CLUSTER 常量,并将它们替换为实际值。现在可以了。感谢 AlmoDev。
  • 致以上评论者,那可能是因为您需要前缀 VUE_APP 所以使用 VUE_APP_MIX_PUSHER_APP_KEY cli.vuejs.org/guide/mode-and-env.html#environment-variables
【解决方案3】:

如果您的代码中有 broadcastOn 方法,我在 TaskCreated 事件中看不到它,只需像这样使用 broadcastAs 方法:

public function broadcastAs()
{
    return 'task.created';
}

在 vue 组件中监听如下事件:

Echo.channel('taskCreated').listen('.task.created', (e) => {
            this.tasks.push(task.body)
        });

更多信息:https://laravel.com/docs/broadcasting 但是关于 laravel-websockets 我最近使用它并且有类似的问题并检查他们的 github repo 结果他们有一些未解决的错误的未解决问题。我喜欢 spatie 包,但是对于这个 tlaverdure/laravel-echo-server 是我的第一选择并且更容易使用。

【讨论】:

    【解决方案4】:

    net::ERR_CERT_AUTHORITY_INVALID。

    请求网址: wss://127.0.0.1/app/local?protocol=7&client=js&version=6.0.2&flash=false

    您的 ssl 认证可能有问题。您正在使用 wss,它仅在 https 上连接。您应该检查您的 ssl 证书或改用 ws

    加提示:

    我会使用 socket.io + redis 组合而不是 pusher。

    【讨论】:

      【解决方案5】:

      也许你可以试试:

      在您的TaskCreated 活动中:

      public function broadcastOn()
      {
         return new Channel('task.created');     
      }
      

      在你的 Vue 中:

      Echo.channel('task.created').listen('TaskCreated', (e) => {
                  this.tasks.push(task.body)
              });
      

      【讨论】:

        【解决方案6】:

        对于 Laravel 6.2 使用 socket.io-client@2.4.0

        【讨论】:

        • 兄弟,谢谢你为我节省了 24 小时
        猜你喜欢
        • 2020-08-30
        • 2022-06-21
        • 2021-05-02
        • 2019-09-21
        • 2020-02-10
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多