2017-04-10 10 views
0

私は、これは、コンソール上のエラーをJS取得しています:プライベートチャンネル

app.js:167キャッチされないにReferenceError:receiverIdは

ここに私の完全なコードがある

に定義されていません。

PrivateChatController:

event(new PrivateMessageEvent($chat, $receiverId)); 

PrivateMessageEvent:

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; 
use App\User; 
use App\PrivateChat; 

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

    public $privateChat, $receiverId; 
    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct(PrivateChat $privateChat, $receiverId) 
    { 
     $this->privateChat = $privateChat; 
     $this->receiverId = $receiverId; 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return new PrivateChannel('private-chat.' . $this->receiverId); 
    } 
} 

Bootstrap.js

import Echo from "laravel-echo" 

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

window.Echo.private(`private-chat.${receiverId}`) 
    .listen('PrivateMessageEvent', (e) => { 
     console.log(e); 
}); 

channels.php

Broadcast::channel('private-chat.{receiverId}', function ($user, $receiverId) { 
    return true; // this is just for debugging to allow anyone to listen on this channel 
    //return $user->id === $receiverId; 
}); 

laravel-エコーserver.json

背景 キューに
{ 
    "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": {}, 
    "sslCertPath": "", 
    "sslKeyPath": "" 
} 

:仕事laravelエコーサーバがすでにそのイベントを発射する際

を実行している、私はlaravel-エコーサーバコンソールに、このメッセージが出ています:

Channel: private-private-chat. 
Event: App\Events\PrivateMessageEvent 
CHANNEL private-private-chat. 

注:

私は10時間以上を過ごし、私ができるすべてのものが、運を試してみました。この行に

$this->$receiverId = $receiverId; 

おかげ

+0

イベントを発生させる前に、 'dd($ receiverId);'を実行してください。 '$ receiverId'がヌルだと言いますか? – Jono20201

+0

@ jono20201、私はすでに変数をチェックしています。それは正しい値を持っています - ヌルではありません。 –

答えて

1

は、この行を変更してください(あなたのPrivateMessageEvent __constructで

$this->receiverId = $receiverId; 

)を

更新:

Tあなたは動のチャンネルを使用する場合は

Echo.join('private-chat.1') 
    .listen('PrivateMessageEvent', (e) => { 
    console.log(e); 
}); 

window.Echo.private('private-chat.1') 

は、私は、あなたにもプレゼンスチャネルを使用することをお勧めあまりにもが、より多くの機能を備えたプライベートで、すなわち:ryは、このような固定されたチャネルIDを使用して使用しますあなたのような数は、すなわちを使用します。

あなたはJavaScriptで値を receiverIdを与える必要があり ​​

は、この宣言は、一般的な部屋のリスナーですが、receiverIdを定義する必要があり、$ {receiverId}があります文字列補間。

あなたは、ブレードの構文を使用して、例えば、app.jsをinluding前に、テンプレートでreceiverIdを定義することができます。

<script> 
    receiverId = {{ $receiverId }}; 
</script> 

別のシンクタンクを:私は上記のすべてのコードでは、receiverIdが表す、ことを明らかにしたいですクライアントが受信するユーザのIDではなく、参加したいチャット/ルームのID。

+0

良い点がありましたが、それは書面での誤植でした。問題は何か別のものです –

+0

それともあなたのコードに書いていますか? laravel-echo-server出力がrecieverIdも逃したためです。それは 'Channel:private-private-chat.1'のようになります。例えば – dparoli

+0

です。今修正されました。 –

関連する問題