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

使用Inertia.js与Laravel处理错误及成功响应遇问题

解决Inertia.js + Laravel中onError/onSuccess回调不触发的问题

问题根源分析

核心问题是Laravel抛出500服务器错误时返回了HTML错误页面,而非Inertia可识别的响应,导致前端无法触发onError回调;同时前端回调写法存在冗余逻辑。


分步解决方案

1. 修复Laravel异常处理,让Inertia请求返回JSON响应

打开app/Exceptions/Handler.php,修改异常渲染逻辑,确保Inertia请求遇到服务器错误时返回JSON格式响应:

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    public function render($request, Throwable $e)
    {
        $response = parent::render($request, $e);

        // 针对Inertia请求,将500错误转为JSON响应
        if ($request->inertia() && $response->isServerError()) {
            return response()->json([
                'message' => $e->getMessage(),
                'errors' => [],
            ], $response->getStatusCode());
        }

        return $response;
    }
}

Laravel 8+版本也可以用renderable方法更优雅处理:

public function register()
{
    $this->renderable(function (Throwable $e, $request) {
        if ($request->inertia()) {
            return inertia('Error', [
                'message' => $e->getMessage(),
            ])->toResponse($request)->setStatusCode(500);
        }
    });
}

2. 修正前端回调写法,移除冗余逻辑

你的前端代码中onError和onSuccess的Promise.all完全多余,且提示文案与操作不匹配,修正后代码如下:

router.post(route("posts.update", this.tweet.id), formData, {
  onBefore: () => confirm("确定要更新这条帖子吗?"),
  onError: (errors) => {
    // 自定义错误处理逻辑,比如显示全局提示
    console.error('更新失败:', errors);
    alert('更新出错了,请检查后重试');
  },
  onSuccess: () => {
    // 成功后的操作,比如跳转列表页或提示用户
    alert('帖子更新成功');
    router.visit(route('posts.index'));
  },
});

3. 确认请求方法与Laravel路由匹配

Laravel中posts.update路由默认是PUT或PATCH方法,若前端用post请求会触发405方法不允许错误,进而导致服务器异常。可修改前端请求为put:

router.put(route("posts.update", this.tweet.id), formData, {
  // ... 回调逻辑
});

4. 检查Inertia基础配置

确保app/Http/Kernel.php的web中间件组包含Inertia中间件:

protected $middlewareGroups = [
    'web' => [
        // ... 其他中间件
        \Inertia\Middleware\HandleInertiaRequests::class,
    ],
];

验证

在Laravel的PostController@update方法中故意抛出异常测试:

public function update(Request $request, Post $post)
{
    throw new \Exception('测试服务器错误');
    // ... 原有逻辑
}

此时前端应触发onError回调,而非跳转到Laravel的500错误页面。

内容的提问来源于stack exchange,提问作者php_learn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:22:52