2017-08-08 14 views
1

リアルタイム更新をセットアップするためにSocket.ioでRedisを使用していますが、Laravel Echoはイベントをキャッチしていません。Laravel Echoはsocket.ioでイベントをキャッチしません

私がio()のインスタンスを使用すると、うまく動作します。ここに私のコードはイベントをリッスンするために私VUEアプリである:

はイベント

window.Echo.channel('users') 
    .listen('UserCreated', event => { 
      console.log(event); 
      this.all_users.push(event.user); 
      this.filter_data(); 
    }); 

をキャッチしませんイベント

window.socket = io(window.location.origin+':3000'); 
window.socket.on('users:App\\Events\\UserCreated', function(data){ 
    console.log(data); 
    console.log('from socket'); 
    this.all_users.push(data.user); 
    this.filter_data(); 
}.bind(this)); 

イベントをプッシュする私のノードjsのコードをキャッチします。

var server = require('http').Server(); 

var io = require('socket.io')(server); 

var Redis = require('ioredis'); 

var redis = new Redis(); 

redis.subscribe('users', function(error, count){ 
    console.log(error); 
    console.log(count); 
}); 

redis.on('message', function(channel, message){ 
    console.log(channel); 
    message = JSON.parse(message); 
    console.log(message); 
    const emmitChannel = `${channel}:${message.event}`; 
    console.log(emmitChannel); 
    io.emit(emmitChannel, message.data); 
}); 

server.listen(3000); 

マイLaravelイベントブロードキャスト

<?php 

namespace App\Events; 

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


//Models 
use App\User; 

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

    public $user; 

    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct(User $user) 
    { 
     $this->user = $user; 

     $this->dontBroadcastToCurrentUser(); 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return ['users']; 
    } 
} 

私は、デフォルトではそれがusers:App\Events\UserCreatedとしてそれらを受けるが、私は運がなかったため、イベントはLaravelエコーに渡される方法を変更しようとしました。

答えて

0

私はついにこれを理解することができました。私はJSファイルを見て、the code in this linetry catchセクションを持っているという事実にそれを固定することができました。チャンネルを聞くことができるLaravel channels.phpチェックがユーザーモデルのインスタンスを返してくれない。 $userfalseを返しますifチェックLaravelに合格しない場合は

Broadcast::channel('users', function ($user) { 
    if($user->type == 'admin'){ 
     return $user; 
    }else{ 
     return false; 
    } 
}); 

:Channels.phpでこのよう

何かがそのエラーをスローします。 JSONを返していないので、返信本体がJSON.parse()関数を渡さなかったことをログに記録する必要があると思いますので、端末で確認できるようにしてください。次のようなものがあります。

try { 
    body = JSON.parse(response.body); 
} catch (e) { 
    Log.warning('Response body provided is not expected JSON. Response body provided ${response.body}'); 
    body = response.body; 
} 

このようにして、Laravelがユーザーモデルインスタンスを返さないかどうかを確認できます。

期待どおりにユーザーモデルインスタンスを取得しないと、sockedIdを未定義にするためにコードを添付するユーザーオブジェクトはありません。オブジェクトを作成するJSONは決してありませんでした。

ソケットIDを添付するのではなく、ユーザーインスタンスを取得しないと、コードがプレゼンスまたはプライベートチャネルに接続しようとするのをやめてください。

とにかく、実際にユーザーを返すには、ログインしていることを確認してくださいusing Laravel's Auth system.これを使用しなかった場合は、動作させるためにいくつかの回避策を講じなければならないかもしれません。あなたがそれを使用していない場合this function in Laravel will throw a 403 error because it can't find you to be logged in

パスワードハッシュアルゴリズムをプロバイダとのカスタムアルゴリズムにチェックする関数を書く必要があったので、Laravelコアを使いこなすことなく、Laravelが探しているクラスをユーザーモデルに拡張させました。

あなたのchannels.phpファイルでは、実際にチェックしていることを確認してください。実際には、Broadcaster.phpファイルの認証チェックからコールバック関数で$ユーザを返しています。このような何か:スーパーシンプルなプライベート/プレゼンスチャンネルだが、ユーザーでログインして、これはこのエラーを捨てないであろう$ユーザーを返すと

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

を。

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

、あなたはこのようなあなたのエコーインスタンスでsocket.ioを呼び出していることを確認してください
関連する問題