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

如何在Vue项目中实现laravel echo客户端

陆琦
2023-03-14

我正在开发一个以Vuetify(Vue.js)为前端的应用程序,该应用程序通过api与laravel后端服务器进行通信。

我试图使一个系统的通知与laravel-echo-server与socket.io.并使用laravel-echo到客户端。

我在客户端组件中用于测试连接是否工作的代码是:

// Needed by laravel-echo
window.io = require('socket.io-client')

let token = this.$store.getters.token

let echo = new Echo({
  broadcaster: 'socket.io',
  host: 'http://localhost:6001',
  auth: {
    headers: {
      authorization: 'Bearer ' + token,
      'X-CSRF-TOKEN': 'too_long_csrf_token_hardcoded'
    }
  }
})

echo.private('Prova').listen('Prova', () => {
  console.log('IT WORKS!')
})

这是laravel echo服务器的代码。json

{
    "authHost": "http://gac-backend.test",
    "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": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}

我试图修改aporigins,但没有成功。事件已调度,我可以在laravel echo服务器日志中看到它:

Channel: Prova
Event: App\Events\Prova

但在此之后,当我访问包含连接代码的客户端组件时,我可以在laravel echo server中看到该组件记录了很长的错误跟踪和下一个错误:

The client cannot be authenticated, got HTTP status 419

如您所见,我在laravel echo客户端的头中指定了csrf令牌和授权令牌。但它不起作用。

这是路线/通道的代码。php

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

我只想听一个事件,它是私人的还是公共的并不重要,因为当它起作用时,我想把它放到服务人员身上。那么,我想如果是公开的,那就更好了。

  • 如何在laravel项目中使用laravel echo客户端

共有3个答案

昝卓
2023-03-14

对于套接字io

npm安装socket.io

如果你得到了无效的帧头设置身份验证终端bootstrap.js如下

窗口。Echo=新的Echo({authEndpoint:'http://project/broadcasting/auth,广播员:'pusher',密钥:'63882dbaf334b78ff949',集群:'ap2',加密:true})

温亮
2023-03-14

为了启动客户端侦听器,我使用了Vuex。然后,当我的应用程序启动时,我调度actionINIT\u CHANNEL\u监听器来启动监听器。

index.js通道模块vuex

import actions from './actions'
import Echo from 'laravel-echo'
import getters from './getters'
import mutations from './mutations'

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

export default {
  state: {
    channel_listening: false,
    echo: new Echo({
      broadcaster: 'socket.io',
      // host: 'http://localhost:6001'
      host: process.env.CHANNEL_URL
    }),
    notifiable_public_channels: [
      {
        channel: 'Notificacio',
        event: 'Notificacio'
      },
      {
        channel: 'EstatRepetidor',
        event: 'BroadcastEstatRepetidor'
      }
    ]
  },
  actions,
  getters,
  mutations
}

行动。通道模块vuex的js

import * as actions from '../action-types'
import { notifyMe } from '../../helpers'
// import { notifyMe } from '../../helpers'

export default {
  /*
  * S'entent com a notifiable un event que té "títol" i "message" (Per introduir-los a la notificació)
  * */
  /**
   * Inicialitza tots els listeners per als canals. Creat de forma que es pugui ampliar.
   * En cas de voler afegir més canals "Notifiables" s'ha de afegir un registre al state del index.js d'aquest modul.
   * @param context
   */
  [ actions.INIT_CHANNEL_LISTENERS ] (context) {
    console.log('Initializing channel listeners...')
    context.commit('SET_CHANNEL_LISTENING', true)

    context.getters.notifiable_public_channels.forEach(listener => {
      context.dispatch(actions.INIT_PUBLIC_NOTIFIABLE_CHANNEL_LISTENER, listener)
    })
    // }
  },

  /**
   * Inicialitza un event notificable a través d'un canal.
   * Per anar bé hauria de tenir un titol i un missatge.
   * @param context
   * @param listener
   */
  [ actions.INIT_PUBLIC_NOTIFIABLE_CHANNEL_LISTENER ] (context, listener) {
    context.getters.echo.channel(listener.channel).listen(listener.event, payload => {
      notifyMe(payload.message, payload.title)
    })
  }
}

帮助程序中的notifyMe函数,该函数在浏览器上发送通知

export function notifyMe (message, titol = 'TITLE', icon = icon) {
  if (!('Notification' in window)) {
    console.error('This browser does not support desktop notification')
  } else if (Notification.permission === 'granted') {
    let notification = new Notification(titol, {
      icon: icon,
      body: message,
      vibrate: [100, 50, 100],
      data: {
        dateOfArrival: Date.now(),
        primaryKey: 1
      }
    })
  }

然后后端使用laravel-echo-server,如问题所示。使用redis对事件进行排队,并在服务器启动时启动laravel-echo-server。

芮学
2023-03-14

您好,我将向您介绍如何使用Laravel和Echo功能配置VUE的整个步骤

步骤1:首先安装laravel

composer create-project laravel/laravel your-project-name 5.4.*

设置变量更改Broadcastservicegie

我们首先需要注册App\Providers\BroadcastServiceProvider。打开config/app。php并取消对providers数组中的下一行的注释。

// App\Providers\BroadcastServiceProvider

我们需要告诉拉威尔,我们正在使用推进器驱动程序。环境文件:

BROADCAST_DRIVER=pusher

在config/app中添加pusher类。php

'Pusher' => Pusher\Pusher::class,

第3步向你的laravel项目添加一个推进器

composer require pusher/pusher-php-server

将以下内容添加到配置/broadcasting.php

'options' => [
          'cluster' => env('PUSHER_CLUSTER'),
          'encrypted' => true,
      ],

步骤5设定推杆变量

PUSHER_APP_ID=xxxxxx
PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxx
PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxx
PUSHER_CLUSTER=xx

步骤6安装节点

npm install

步骤7安装推进器js

npm install --save laravel-echo pusher-js 

步骤8:取消以下操作

// resources/assets/js/bootstrap.js

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'xxxxxxxxxxxxxxxxxxxx',
    cluster: 'eu',
    encrypted: true
});

创建迁移之前的步骤9

// app/Providers/AppServiceProvider.php
// remember to use
Illuminate\Support\Facades\Schema;

public function boot()
{
  Schema::defaultStringLength(191);
}
 类似资料:
  • 我试图在Java项目中创建一个graphql客户机,我正在使用apollographql库。问题是,我无法使用版本不同于中央存储库的pom.xml获得依赖关系。另一件事是所有的例子都是用Gradle构建的。关于如何使用apollo库和maven项目创建一个简单的订阅客户机,您有什么示例或想法吗?我遇到的一个具体问题是,一旦下载了apollographql-runtime库,就没有“订阅”包了。我想

  • 我开始着手一个JavaFX项目,在这个项目中,我想添加一个复制的文本,而不必更改驱动程序中的格式和图像(它应该像open office一样工作)。图像应该能够放置在文本中不同的位置。因此,我需要一个可以处理rtf格式的控制字段。 为此,我找到了RichTextFX。文档中解释了如何使用Maven或Grandle运行RichTextFX。我不使用Maven或Grandle,因此我想知道是否有可能在不

  • 我最近开始使用android Studio3.1.2和SDK19(Android4.4)编写我真正的第一个android项目。

  • 在Vue项目实现文件下载的时候遇到一个问题,无论是使用a标签还是使用windown.open(url)都只会在网页打开预览,但是都不能下载,请问这是什么问题?应该如何去避免从而实现下载功能呢?查了好久资料,来来去去都是那一片文章抄来抄去,实在让人难受!!!这些粘贴怪真恶心!!!

  • 更新!!!! 观看缩进!我的插件部分在我的代码编辑器中缩进,因此它作为包主题的一部分读取。现在我至少有一个插件在工作,我觉得有点理智。现在开始调试另一个... 谢谢,留下这个以防其他人犯同样的错误! 作为参考: MKDocs 1.0.4 Pip 19.2.3 Python 3.8.1 很抱歉没有发布原始代码,因为这可能会有所帮助,因为需要另一个同事开发人员才能为我注意到这一点。 原帖子: 我不太确

  • 我有一个运行在j2ee服务器(jboss 4.0.4)上的axis2 web服务客户端,该服务器一直在使用tomcat上托管的web服务。最近tomcat管理员打开了TLS,现在我的axis2客户端无法工作。如何为axis2客户端打开TLS? 谢谢你的帮助!