2017-06-01 6 views
12

Aus welchem ​​Grund auch immer, ich kann keine Daten auf meiner Client-Seite von Laravel Echo erhalten. Ich benutze Laravel-Echo-Server (Socket.io), Redis Broadcaster und Redis-Warteschlangen. Soweit ich das beurteilen kann, sind sie alle funktional. Ich werde Ihnen zeigen, wie ich es zum Testen eingerichtet habe. Zuerst habe ich eine nutzererzeugte Ereignis erstellt:Laravel Echo nie erhalten Ereignis

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

    public $user; 

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

    public function broadcastOn() 
    { 
     return new Channel('user-created'); 
    } 

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

Dann dieses Ereignis zu testen, habe ich eine AngelegtVon Befehl erstellt:

class CreateUser extends Command 
{ 
    protected $signature = 'create:user {username}'; 

    protected $description = 'Create a new user!'; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function handle() 
    { 
     $user = \Chatter\User::create([ 
      'name' => $this->argument('username'), 
      'email' => uniqid() . '@gmail.com', 
      'password' => bcrypt('secret') 
     ]); 
     event(new \Chatter\Events\UserCreated($user)); 
    } 
} 

Schließlich ist hier mein Laravel-Echo-server.json:

{ 
    "authEndpoint": "/broadcasting/auth", 
    "authHost": "chatter.dev", 
    "database": "redis", 
    "databaseConfig": { 
     "redis": { 
      "port": "6379", 
      "host": "localhost" 
     } 
    }, 
    "port": 6001, 
    "protocol": "http", 
    "sslCertPath": "", 
    "sslKeyPath": "", 
    "socketio": {} 
} 

Als nächstes lief ich und laravel-echo-server start. Beide liefen ohne Fehler. Um sicherzustellen, dass der Server funktioniert, habe ich php artisan create:user Bob123. Es war erfolgreich. Die Warteschlange zurückgegeben diese (in der Konsole):

[2017-06-01 01:28:27] Processing: Chatter\Events\UserCreated 
[2017-06-01 01:28:27] Processed: Chatter\Events\UserCreated 

Und den Laravel-Echo-Server dieses zurückgegeben (in der Konsole):

CHANNEL user-created 

, so dass die Daten erhalten ich mit dem Benutzer gesendet, ich erstellt eine Vue-Komponente mit einem Echo-Listener in der angehängten Funktion. Hier ist meine Komponente:

<template> 
    <div class="container"> 
     <div class="row"> 

     </div> 
    </div> 
</template> 

<script> 
    export default { 
     mounted() { 
      console.log('Component mounted.'); 
      window.Echo.channel('user-created') 
       .listen('.user.created', (data) => { 
        console.log(data); 
       }); 
     }, 

     data(){ 
      return { 
       messages: [] 
      } 
     } 
    } 
</script> 

Wenn ich meine Webseite aktualisiert, Component mounted an der Konsole angemeldet wurde, damit ich sicher bin, dass es geladen. Aber aus welchem ​​Grund auch immer, wenn ich den CreateUser-Befehl sende, werden die Daten nicht in der Browser-Konsole eingeloggt.

Hier ist alles, was Sie darauf hinweisen könnte:

ich meine Sendung Treiber geändert, um Redis meine .env

BROADCAST_DRIVER=redis 
CACHE_DRIVER=redis 
SESSION_DRIVER=redis 
QUEUE_DRIVER=redis 

REDIS_HOST=127.0.0.1 
REDIS_PASSWORD=null 
REDIS_PORT=6379 

ich unkommentiert auch die BroadcastingServiceProvider in der app.php Konfig.

Ich kann jetzt nicht an etwas anderes denken, dass Sie vielleicht darauf hinweisen, dass ich getan habe, aber wenn ich mich an andere erinnere, werde ich die Frage aktualisieren.

Danke für jede Hilfe.

Hinweis: Ich bin mit Redis nicht vertraut, daher lehne ich mich derzeit dem Problem an. Einfach predis\predis als Abhängigkeit hinzuzufügen, fühlt sich einfach nicht so an, als wäre das alles, was ich tun muss. Hoffentlich hilft diese Notiz.

Edit:

Wie bereits angedeutet, ich versuchte, läuft redis-server bevor ich Laravel-Echo-Server lief. Dies ist, was in der Konsole zurückgegeben wurde:

[email protected]:~/Code/Chatter$ redis-server 
16342:C 01 Jun 05:45:38.066 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 
16342:M 01 Jun 05:45:38.067 * Increased maximum number of open files to 10032 (it was originally set to 1024). 
16342:M 01 Jun 05:45:38.067 # Creating Server TCP listening socket *:6379: bind: Address already in use 

Ich nehme an, dies bedeutet, dass der redis Server ausgeführt wurde, so dass ich denke, Heimstätte startet es automatisch in der Standardeinstellung.

Github Repository:

Leider dauerte das so lange, ich war persönlich sehr beschäftigt. Hier ist der Link zum github-Repository für dieses Projekt. Wenn Sie Fragen zum Repository haben, lassen Sie es mich wissen.

https://github.com/Dastur1970/laravel-echo-test

Edit 2:

Nur falls jemand es braucht, hier ist mein der Code habe ich meine Echo Instanz zu erstellen.

window.Echo = new Echo({ 
    broadcaster: 'socket.io', 
    host: window.location.hostname + ':6001' 
    // auth: { 
    //  headers: { 
    //   'Authorization': 'bf242984230eb684 1076b91e572e5bbcc81a852471364c49' 
    //  } 
    // }, 
    // key: '1076b91e572e5bbcc81a852471364c497', 
    // csrfToken: token.content 
}); 

Kommentierte einige der Sachen, mit denen ich getestet habe. Ich war mir nicht sicher, ob ich das wieder brauchen würde und ich ließ sie einfach kommentiert. Lassen Sie mich wissen, ob einer der kommentierten Codes hilfreich sein kann.

+0

Ihr redis Server vor Laravel-Echo-Server gestartet werden soll –

+0

@NehalHasnayeen Könnten Sie bitte auf erarbeiten, wie ich dies tun könnte? – Dastur

+0

Sie führen 'redisis-server' zuerst aus und wenn es läuft, dann starten Sie den' laravel-echo-server' –

Antwort

2

Ich habe Ihre GIT Repo auf meinem lokalen PC eingerichtet und habe das Problem.

Sie verwenden einen benutzerdefinierten Namespace namens "Chatter", so dass Sie dies explizit in Ihrem JS-Code definiert haben, sodass Echo wissen kann, wie diese Event-Klasse gefunden wird.

Ändern Sie einfach "UserCreated" mit ".Chatter.Events.UserCreated" in public/js/app.js und Sie sind gut gehen:

mounted: function mounted() { 
     console.log('Component mounted.'); 
     console.log(window.Echo); 
     window.Echo.channel('user-created').listen('.Chatter.Events.UserCreated', function (data) { 
      console.log('tester123'); 
     }); 
    }, 

Weitere Informationen: https://laravel.com/docs/master/broadcasting#namespaces

2

Okay, lassen Sie uns die möglichen Teile, wo man Fehler sein könnte:

Dies ist die Warteschlange, die der Server durch läuft

  1. Ereignis
  2. Zuhörer
  3. Redis
  4. Laravel -echo-Server
  5. Client

[2017.06.01 01.28.27] verarbeitet: Chatter \ Events \ nutzererzeugte

das Ereignis erfolgreich durch den Hörer (Schritt 2)

CHANNEL behandelt wurde Benutzer erstellte

die Veranstaltung in der Datenbank und dem Laravel-Echo-Server hat es geschrieben wurde (Schritt 4)

Normalerweise gibt die laravel-echo-server eine Nachricht aus, wenn ein neuer Benutzer einem Kanal beitritt. Ich sehe keine dieser Nachrichten in Ihrem Code, so könnte die Verbindung zwischen dem laravel-echo-server und dem Client das Problem sein. Außerdem sehe ich keinen Code, wo Sie das Objekt Echo auf dem Client mit Javascript erstellen.

+0

Ihr Recht es ist seltsam, dass es nicht zeigt, dass Benutzer r Beitritt zum Kanal, sondern über die '.user.created 'Sie mit einem Punkt vorangestellt, wenn Sie Ihr Ereignis mit der' broadcastAs' Methode in dem Ereignis umbenennen. – Dastur

+0

nie 'Boradcastas' zuvor verwendet, aber nach Überprüfung der offiziellen Dokumentation fand ich den führenden Punkt. Können Sie Ihren 'neuen Echo'-Code dort posten, wo Sie die Verbindung zum Server herstellen? – mimo

+0

Ich habe oben mit meinem Code bearbeitet, wo ich Echo instanziiert habe. – Dastur

Verwandte Themen