【问题标题】:Laravel Echo server responds nothing in browserLaravel Echo 服务器在浏览器中没有响应
【发布时间】:2020-06-12 07:43:20
【问题描述】:

我正在学习https://medium.com/@dennissmink/laravel-echo-server-how-to-24d5778ece8b 中给出的教程。

我安装了laravel-echo-serverredissocket.iolaravel-echo

这是laravel-echo-server init的配置

{
    "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": {},
    "secureOptions": 67108864,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}

这个js代码在app.blade.php的底部,包含在所有页面中

<script type="module">
    import Echo from 'laravel-echo'

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

    window.Echo.channel('test-event')
        .listen('ExampleEvent', (e) => {
            console.log(e);
        });
</script>

我创建了一个事件php artisan make:event ExampleEvent如下

namespace App\Events;

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

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

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('test-event');
    }

    public function broadcastWith()
    {
        return [
            'data' => 'Hi bro!'
        ];
    }
}

接下来的路线

Route::get('test-broadcast', function(){
    broadcast(new \App\Events\ExampleEvent);
});

我还启动了一个队列监听器

php artisan queue:listen --tries=1

当我访问页面 test-broadcast 时,我在终端中看到了这个

但是浏览器的控制台什么也没有显示,而console.log(e); 必须返回一些东西。我也这样做了

    window.Echo.channel('test-event')
        .listen('ExampleEvent', (e) => {
            alert('hi')
            console.log(e);
        });

但没有任何警报。听着好像有问题。

提前致谢。

更新

访问login 或任何包含app.blade.php 的页面时,我从浏览器控制台收到此错误

更新

我更新了脚本代码如下

    <script src="http://{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script>
    <script src="{{ asset('/js/app.js') }}"></script>
    <script type="module">
        import Echo from 'laravel-echo'

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

        window.Echo.channel('test-event')
            .listen('.ExampleEvent', (e) => {
                console.log(e);
            });
    </script>

控制台还是报错

TypeError:解析模块说明符时出错:laravel-echo

更新

我跑

npm run development -- --watch

这就是结果

cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js “--看”

'cross-env' is not recognized as an internal or external command,
operable program or batch file.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/
setup/webpack.config.js "--watch"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ development script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Mamad\AppData\Roaming\npm-cache\_logs\2020-03-05T14_59_30_604Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ watch: `npm run development -- --watch`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ watch script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Mamad\AppData\Roaming\npm-cache\_logs\2020-03-05T14_59_30_697Z-debug.log

【问题讨论】:

  • 您是否使用“npm run build”构建了您的应用程序?此外,您的错误查找会产生 this
  • @DanielProtopopov 声明“npm run build”不在那个教程中,所以我没有这样做。
  • 不是,但它(有点)在 cmets 部分。作者经常通过前几个来检查有价值的信息以修改文章;)。里面还有一些其他有用的东西。
  • @DanielProtopopov 我添加了对问题的更新
  • 我相信你没有抓住重点:刀片文件中的 Javascript/Typescript 不会通过 NPM 被编译或视为 Javascript 编译的一部分。它最终应该在被编译的 app.js 中,并通过该编译处理您的导入语句。我将尝试在空白的 Laravel 上进行完整安装,并通过演练发布答案。

标签: php laravel sockets laravel-echo


【解决方案1】:

总而言之,这是需要的:

  1. 默认 Laravel 安装
  2. 作曲家需要 predis/predis
  3. 安装 NPM 模块(laravel-echo-server、socket.io 和 laravel-echo)
  4. 通过控制台设置 Laravel Echo Server(大部分是默认设置,域名除外): { "authHost": "http://echo", "authEndpoint": "/broadcasting/auth", "clients": [ { "appId": "fc3de97a1787ea04", "key": "ecf31edced85073f7dd77de1588db13b" } ], "database": "sqlite", "databaseConfig": { "redis": {}, "sqlite": { "databasePath": "/database/laravel-echo-server.sqlite" } }, "devMode": true, "host": null, "port": "6001", "protocol": "http", "socketio": {}, "secureOptions": 67108864, "sslCertPath": "", "sslKeyPath": "", "sslCertChainPath": "", "sslPassphrase": "", "subscribers": { "http": true, "redis": true }, "apiOriginAllow": { "allowCors": true, "allowOrigin": "http://echo:80", "allowMethods": "GET, POST", "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id" } }

  5. 设置 Redis 服务器并使用 Laravel broadcasting.php 文件连接到它

'default' =&gt; env('BROADCAST_DRIVER', 'redis')

或 .env 文件中的 BROADCAST_DRIVER=redis

  1. 在web.php中添加路由

Route::get('/test-broadcast', function(){ broadcast(new \App\Events\ExampleEvent); return response('OK'); });

  1. 在 bootstrap.js 中添加代码:

从 'laravel-echo' 导入 Echo

window.io = require('socket.io-client');
window.Echo = 新回声({ 广播公司:'socket.io', 主机:window.location.hostname + ':6001' });

添加

window.Echo.channel('MyChannel') .listen('.ExampleEvent', (e) => { 控制台.log(e); });

  1. 运行 npm run dev 编译所有 Javascript 模块
  2. 运行 laravel-echo-server start 启动 Laravel Echo 服务器
  3. 运行php artisan queue:listen --tries=1 启动监听队列
  4. 访问http://echo/test-broadcast

更新

11.1 将 ExampleEvent 的方法调整为:

公共函数broadcastOn() { 返回新频道('我的频道'); }

公共函数广​​播As() { 返回“示例事件”; }

11.2 在welcome.blade.php中,在BODY标签前添加

&lt;script type="text/javascript" src="/js/app.js"&gt;&lt;/script&gt;

11.3 在database.php中,设置redix前缀为空字符串值

'prefix' =&gt; env('REDIS_PREFIX', '')

不要忘记重新运行npm run dev 并清除浏览器缓存

结果

【讨论】:

  • 问题:每次运行xampp 和localhost 时都需要设置echo 吗?关于您的回答,我在访问test-broadcast 页面时得到了相同的回复Ok。但我认为你错过了一些东西,结果Ok 是因为return response('ok');,但我需要告诉客户端服务器端的一些事情。例如,如果用户访问/login,我需要在test-broadcast 页面的控制台中打印一些内容。您的示例不会通知test-broadcast 页面有关服务器中发生的事情。
  • 我不知道您可能有任何其他要求,它们取决于您,我仅添加了响应 200 作为示例。 Echo 是一个本地域名,你可以用任何其他域名替换它,无论是 localhost 还是其他任何域名。
  • 您是否在任何刀片文件中包含bootstrap.js
  • 您没有从服务器向客户端发送任何响应以通知它任何更改
  • 我找到了,我不应该直接包含bootstrap.js!包含public/js/app.js 就足够了:|
【解决方案2】:

根据您的错误,我认为您的软件包未安装或导入不正确。你可以试试安装包

npm install --save socket.io-client laravel-echo

将这些代码添加到 fileresources/js/bootstrap.js

的末尾
import Echo from "laravel-echo"

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

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

然后运行npm run watch

参考:https://laravel.com/docs/master/broadcasting#driver-prerequisitespart socket.io

【讨论】:

  • 我用 npm run development 的结果更新了问题 -- --watch
  • 运行npm install之前安装所有需要的包,包括cross-env
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多