2017-07-21 179 views
0

我正在尝试在Laravel 5.4中的两个人之间用Pusher进行聊天。推送订阅错误。 Laravel

首先,我送一个Ajax post请求:

$('#btn-chat').click(function(){ 
    $.post('sendMessage',{ 
     _token: $("[name='csrf-token']").attr('content'), 
     user_id: userId, 
     chat_id: 1, 
     message: $('#btn-input').val() 
    }, 
    function(data) { 
     console.log(data); 
    }); 
}); 

然后,控制器接受请求:

public function sendMessage(Request $request){ 
    $user = Auth::user(); 
    $message = new Message; 
    $message->fill($request->all()); 
    $message->message = $request->message; 
    $message->save(); 
    broadcast(new MessageSent($message))->toOthers(); 
    return 'Return MessageController'; 
} 

而且,这里是我的MessageSent事件:

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

    public $message; 

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

    public function broadcastOn() { 
     return new PrivateChannel('chat.'.$this->message->chat_id); 
    } 
} 

和我的channels.php文件:

Broadcast::channel('App.User.{id}', function ($user, $id) { 
    return (int) $user->id === (int) $id; 
}); 

Broadcast::channel('chat.*', function ($user, $chat_id) { 
    return (int) $user->id === (int) $chat_id; 
}); 

最后,JavaScript的监听事件:

var pusher = new Pusher('pusher_key', { 
    cluster: 'us2', 
    encrypted: true, 
    authEndpoint: 'broadcasting/auth', 
    auth: { 
     headers: { 
     'X-CSRF-Token': $("[name='csrf-token']").attr('content') 
     } 
    } 
}); 
Pusher.logToConsole = true; 
var channel = pusher.subscribe('private-chat.1'); 
channel.bind('MessageSent', (data) => { 
    alert(data.message); 
}); 

所有应该在工作,但是当我加载聊天页面,它抛出一个错误的JavaScript控制台上:

Pusher : No callbacks on private-chat.1 for pusher:subscription_error 
+0

我的问题就解决了。至少有一天我有这个问题,在发布这个问题之前,我试图自己解决它。让我尽快解释我的解决方案,soryy。 –

回答

0

推进器在某些情况下自动发出事件。

Pusher : No callbacks on private-chat.1 for pusher:subscription_error

告诉你,有订阅这个频道的错误,但是你有没有必然的回调到该事件。通过绑定到subscription:error事件,您应该能够获得有关您在订阅期间遇到的错误的更多信息。你可以找到更多信息here

0

由于leesio anwsered,如果错误发生,Pusher会发出事件。

Afther我加入:

channel.bind('pusher:subscription_error', function(data) { 
    console.log(data); 
}); 

它显示在控制台:

JSON returned from webapp was invalid, yet status code was 200. 

由于Laravel广播路由(广播/ AUTH)返回的HTTP响应,而不是推动器的需求JSON。 所以我的解决方案是创建一个新的路由(pusherAuth),然后返回到推杆以下JSON:

public function pusherAuth(Request $request){ 
    $key = 'xxxxxxxxxxxxx'; 
    $secret = 'xxxxxxxxxxxxxx'; 
    $channel_name = $request->channel_name; 
    $socket_id = $request->socket_id; 
    $string_to_sign = $socket_id.':'.$channel_name; 
    $signature = hash_hmac('sha256', $string_to_sign, $secret); 
    return response()->json(['auth' => $key.':'.$signature]); 
} 

客户端JavaScript:

var pusher = new Pusher('xxxxxxxxxxxxx', { 
    cluster: 'us2', 
    encrypted: true, 
    authEndpoint: 'pusherAuth', //Before 'broadcasting/auth' 
    auth: { 
     headers: { 
     'X-CSRF-Token': $("[name='csrf-token']").attr('content') 
     } 
    } 
}); 

和应做的工作。我不知道为什么我不能用Laravel广播路线来做,但如果任何人有同样的问题,我发布这个答案。

更多信息: