在React应用程序中触发一个私有频道的事件。
在React应用程序中触发一个私有频道的事件。
我想要触发一个事件来推送到Pusher的私有频道,我的服务器端语言是laravel。我查阅了很多资源,但没有找到一个全面的方法,既涵盖了服务器端,又涵盖了前端。最终我找到了这个解决方案:\n第一步:\n
export const SendChat = () => { try { var pusher = new Pusher('YOUR_APP_KEY', { cluster: 'ap2', forceTLS: true, authTransport: 'jsonp', authEndpoint: `${baseUrl}pusher/auth`, }); var channel = pusher.subscribe('private-channel'); channel.bind('pusher:subscription_succeeded', function() { var triggered = channel.trigger('client-EVENT_NAME', { 'message': 'Hi ....' }); console.log(triggered) }); } catch (error) { console.error(error); } }
\n然后在某个地方调用它:\n
\n你必须在Pusher账号设置中启用客户端事件:\n
登录到Pusher账号 -> 选择频道 -> 应用设置 -> 选择启用客户端事件 -> 更新
\n在此之后,添加你的应用密钥、频道名称和事件名称。然后我们需要在服务器端进行授权,这是示例laravel代码,首先在web.php中添加以下路由:\n
Route::get('pusher/auth', 'PusherController@pusherAuth');
\n创建PusherController.php文件,内容如下:\n
public function pusherAuth() { $user = auth()->user(); if ($user) { $pusher = new Pusher('auth_key', 'secret', 'app_id'); $auth= $pusher->socket_auth(Input::get('channel_name'), Input::get('socket_id')); $callback = str_replace('\\', '', $_GET['callback']); header('Content-Type: application/javascript'); echo($callback . '(' . $auth . ');'); return; }else { header('', true, 403); echo "Forbidden"; return; } }
\n测试一下,你应该会看到类似于以下内容:\n
Pusher : State changed : connecting -> connected with new socket ID 3953.****556 Pusher : Event sent : {"event":"pusher:subscribe","data":{"auth":"83045ed1350e63c912f5:328fb78165d01f7d6ef3bb6d4a30e07c9c0ad0283751fc2c34d484d4fd744be2","channel":"private-chat"}} Pusher : Event sent : {"event":"client-MessageSent","data":{"message":"Hi ...."},"channel":"private-chat"} true
问题出现的原因:在使用Pusher进行WebSockets开发时,推荐使用Laravel Echo作为React部分的包。在后端的config/broadcasting.php文件中设置Pusher的配置。
解决方法:参考Laravel的官方文档,了解如何在后端和前端使用Pusher。
文章内容如下:
对于在Laravel中使用Pusher进行WebSockets开发,我推荐使用React部分的包Laravel Echo。在后端方面,在config/broadcasting.php中设置Pusher的配置。更多详细信息请参考Laravel官方文档,了解如何在后端和前端使用Pusher。
链接:https://laravel.com/docs/8.x/broadcasting#pusher-channels
问题的出现原因是需要在React应用中触发一个事件到私有频道,但是缺乏相关的配置和代码实现。解决方法是在后端进行相应的配置,并在前端代码中进行Pusher的实例化和事件绑定。
首先需要完成不使用Pusher的聊天场景,即用户能够通过API从前端发送消息并将其存储在数据库中。完成这一步后,就可以很容易地将Pusher集成到流程中,只需要广播一个事件,通知Socket服务器向频道上的所有/其他用户广播消息。
对于Pusher的身份验证,不需要显式地创建路由和方法。只需要在config/app.php中取消注释BroadcastServiceProvider,然后运行php artisan route:list命令,会看到一个用于广播的路由broadcasting/auth。可以在这个路由之前添加/api前缀,然后在BroadcastServiceProvider.php中使用Broadcast::routes方法进行配置。
在ReactJS中创建一个Pusher实例的服务,并在构造函数中进行实例化。可以在页面加载时调用这段代码。
然后需要订阅频道,通过Pusher的实例可以订阅频道并绑定事件。在函数组件或页面中获取Pusher实例后,可以使用pusher.subscribe方法订阅频道,并使用channel.bind方法绑定事件。
最后,在后端编写一个存储消息的方法,并在其中使用broadcast方法广播新消息事件给其他用户。
以上就是解决问题的方法,可以在React Native中进行尝试,但作者并没有在React Native中进行过测试,不过由于这是后端的更改,所以作者相信它对任何JS框架都能正常工作。