You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:34:56