Laravel+Pusher聊天应用AJAX请求/broadcast路由XHR 500错误求助
Laravel + Pusher 聊天应用AJAX请求/broadcast路由触发500内部服务器错误
我正在用Pusher和Laravel搭建简易聊天应用,Pusher配置正常。但通过AJAX向/broadcast路由发消息并在Blade视图展示时,每次请求都触发Internal Server Error 500及XHR错误。
具体错误信息
homePage:97 XHR: { readyState: 4, status: 500, statusText: "Internal Server Error" // 其他XHR方法省略 }
前端代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="https://js.pusher.com/8.2.0/pusher.min.js"></script> <script src="https://js.pusher.com/7.2/pusher.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.js"></script> </head> <body> <h1>home page</h1> <div> @include('receive', ['message' => "Hey!"]) @include('receive', ['message' => "I am here"]) </div> <form method="POST"> <input type="text" id="message" name="message" placeholder="Enter message..." autocomplete="off"> <button type="submit">SEND</button> </form> <script> // Enable pusher logging - don't include this in production Pusher.logToConsole = true; var pusher = new Pusher('d626d6f2f79dccc3bd38', { cluster: 'eu' }); var channel = pusher.subscribe('public'); /* channel.bind('chat', function (data) { $.post("/receive", { _token: '{{csrf_token()}}', message: data.message, }) .done(function (res) { $(".messages > .message").last().after(res); $(document).scrollTop($(document).height()); }); });*/ //Broadcast messages $("form").submit(function (event) { event.preventDefault(); $.ajax({ url: "/broadcast", method: 'POST', headers: { 'X-Socket-Id': pusher.connection.socket_id }, data: { _token: '{{csrf_token()}}', message: $("form #message").val(), } }).done(function (res) { $(".messages > .message").last().after(res); $("form #message").val(''); $(document).scrollTop($(document).height()); }); }); </script> </body> </html>
日志信息
- Laravel存储日志(截断):
#49 C:\laragon\www\echo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #50 C:\laragon\www\echo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(175): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #51 C:\laragon\www\echo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
- Apache服务器日志:
[mpm_winnt:notice] [pid 24092:tid 380] AH00354: Child: Starting 64 worker threads. [Wed Jun 05 16:47:24.255676 2024] [mpm_winnt:notice] [pid 23176:tid 360] AH00364: Child: All worker threads have exited. [Wed Jun 05 18:21:43.896426 2024] [mpm_winnt:notice] [pid 8452:tid 368] AH00422: Parent: Received shutdown signal -- Shutting down the server. [Wed Jun 05 18:21:45.920607 2024] [mpm_winnt:notice] [pid 24092:tid 380] AH00364: Child: All worker threads have exited
已将php.ini内存调整至512MB,问题仍未解决。
排查与解决步骤
1. 获取完整Laravel错误日志
当前存储日志仅显示调用栈末尾,需要查看storage/logs/laravel.log中对应请求时间点的完整错误信息,这是定位500错误的核心。常见原因包括:
/broadcast路由未定义或逻辑错误- 广播事件类不存在/配置错误
- CSRF验证异常
- Pusher环境配置未加载
2. 检查路由定义
确保routes/web.php或routes/api.php中存在/broadcast的POST路由,指向正确的控制器方法:
Route::post('/broadcast', [ChatController::class, 'broadcastMessage']);
3. 修复前端代码问题
- 移除重复引入的Pusher JS版本(保留一个即可,比如最新的8.2.0):
<script src="https://js.pusher.com/8.2.0/pusher.min.js"></script> - 添加缺失的
.messages容器,否则AJAX回调无法找到目标元素:<div class="messages"> @include('receive', ['message' => "Hey!"]) @include('receive', ['message' => "I am here"]) </div>
4. 验证广播逻辑
确保控制器的broadcastMessage方法正确触发广播事件:
public function broadcastMessage(Request $request) { $request->validate(['message' => 'required|string']); broadcast(new ChatMessageEvent($request->message))->toOthers(); return view('receive', ['message' => $request->message]); }
同时确认ChatMessageEvent类实现ShouldBroadcast接口,指定正确的频道和事件名:
class ChatMessageEvent implements ShouldBroadcast { use Dispatchable, InteractsWithSockets, SerializesModels; public $message; public function __construct($message) { $this->message = $message; } public function broadcastOn() { return new Channel('public'); } public function broadcastAs() { return 'chat'; } }
5. 检查.env配置
确认Pusher配置正确,并清除配置缓存:
BROADCAST_DRIVER=pusher PUSHER_APP_ID=你的APP_ID PUSHER_APP_KEY=d626d6f2f79dccc3bd38 PUSHER_APP_SECRET=你的APP_SECRET PUSHER_APP_CLUSTER=eu
执行命令:
php artisan config:clear
6. 直接测试路由可用性
用curl或Postman发送POST请求到/broadcast,携带_token和message参数,查看具体错误:
curl -X POST http://localhost/broadcast -d "_token=你的CSRF_TOKEN&message=测试消息"
内容的提问来源于stack exchange,提问作者user23646520
相关产品推荐
相关产品推荐

