Laravel Эхо-сервер ничего не отвечает в браузере - PullRequest
5 голосов
/ 28 февраля 2020

Я следую инструкциям, приведенным в https://medium.com/@dennissmink / laravel -echo-server-how-to-24d5778ece8b .

Я установил laravel-echo-server, redis, socket.io, laravel-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 Я вижу это в терминале

enter image description here

Но консоль браузера ничего не показывает, пока console.log(e); должен что-то вернуть. Я также сделал это

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

, но ничего не было предупреждено. Кажется, что-то не так с прослушиванием.

Заранее спасибо.

update

Я получаю эту ошибку с консоли браузера при посещении login или на любой странице есть app.blade.php

enter image description here

Обновление

Я обновил коды сценариев, как показано ниже

    <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

update

Я запускаю

npm run development -- --watch

и это это результат

cross-env NODE_ENV = узел_модулей разработки / webpack / bin / webpack. js --progress --hide-modules --config = node_modules / laravel -mix / setup /webpack.config.js "--watch"

'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

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

В целом это то, что требуется:

  1. По умолчанию Laravel установка
  2. composer Требуется predis / predis
  3. Установка NPM модулей (laravel -echo-сервер, 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 широковещания. php файл

'default' => env('BROADCAST_DRIVER', 'redis')

или BROADCAST_DRIVER = восстановить в файле .env

Добавление маршрута в сеть. php

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

Добавление кода в bootstrap. js:

import Echo из 'laravel -echo'

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

ДОБАВЛЕНО

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

Запуск npm run dev для компиляции всех Javascript модулей Запуск laravel-echo-server start для запуска Laravel Echo Server Запуск php artisan queue:listen --tries=1 для запуска очереди прослушивания Доступ к http://echo/test-broadcast

ОБНОВЛЕНО

11.1 Настройте методы для ExampleEvent на:

publi c function broadcastOn () {return new Channel ('MyChannel'); }

publi c function broadcastAs () {return 'ExampleEvent'; }

11.2 В welcome.blade. php перед тегом BODY добавьте

<script type="text/javascript" src="/js/app.js"></script>

11,3 в базу данных. php, установите redix префикс для пустой строковой переменной

Queue running

Laravel Echo Server console results

Client & Server alongside

1 голос
/ 03 марта 2020

Из вашей ошибки, я думаю, что ваши пакеты не установлены или импортированы неправильно. Вы можете попробовать установить пакет

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 -условия part socket.io

...