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

Svelte通过Fetch POST请求Laravel API出现500内部服务器错误求助

问题描述

我正在开发一款打字测试游戏,游戏结束计算出WPM(每分钟打字字数)后,需要将WPM数据提交到Laravel搭建的REST API服务器存入数据库,用于后续排行榜功能。但调用Svelte中的fetch方法发送POST请求时,出现500内部服务器错误,无法提交数据;使用Postman测试相同接口却能正常运行,修改fetch代码也无效果,特此求助解决。


相关代码

Svelte中的fetch提交方法

async function sendWPMToServer(wpm) {
        try {

            const currentUser = $authenticatedUser;
            if (!currentUser) {
                console.error("User is not authenticated");
                return;
            }

            const response = await fetch("http://127.0.0.1:8000/api/scores", {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
                credentials: "include",
                body: JSON.stringify({
                    user_id: currentUser.id,
                    wpm_score: wpm,
                }), 
            });
        } catch (error) {
            console.log("Error");
        }
    }

Laravel路由配置(api.php)

Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);

Route::middleware('auth:sanctum')->group(function() {
    Route::get('user', [AuthController::class, 'user']);
    Route::post('logout', [AuthController::class, 'logout']);
    Route::post('scores', [ScoresController::class, store]);
});

Laravel分数控制器(ScoreController.php)

public function store(Request $request)
    {
        $userId = $request->input('user_id');
        $wpmScore = $request->input('wpm_score');

        UserScore::create([
            'user_id' => $userId,
            'wpm_score' => $wpmScore,
        ]);

        return response()->json(['message' => 'Score stored successfully'], 201);
    }

Postman导出的请求代码

myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "jwt=1%7CEHYsf3eIO3X82iyeDwJunfnXcR2E1x1eQNPgkbFH078daa05");

var raw = JSON.stringify({
  "user_id": 1,
  "wpm_score": 60
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://127.0.0.1:8000/api/scores", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

排查与解决步骤

1. 修复路由语法错误

Laravel路由中调用控制器方法时缺少引号,这是直接导致500错误的原因:

// 错误写法
Route::post('scores', [ScoresController::class, store]);

// 正确写法
Route::post('scores', [ScoresController::class, 'store']);

2. 完善fetch的错误处理逻辑

原代码仅捕获网络错误,未处理服务器返回的错误响应,添加状态检查以便定位问题:

async function sendWPMToServer(wpm) {
    try {
        const currentUser = $authenticatedUser;
        if (!currentUser) {
            console.error("用户未认证");
            return;
        }

        const response = await fetch("http://127.0.0.1:8000/api/scores", {
            method: "POST",
            headers: {
                "Content-Type": "application/json",
            },
            credentials: "include",
            body: JSON.stringify({
                user_id: currentUser.id,
                wpm_score: wpm,
            }), 
        });

        // 新增:检查响应状态并输出错误详情
        if (!response.ok) {
            const errorInfo = await response.json();
            console.error("服务器返回错误:", errorInfo);
            throw new Error(`请求失败,状态码:${response.status}`);
        }

        const successData = await response.json();
        console.log("分数提交成功:", successData);
    } catch (error) {
        console.error("提交失败:", error.message);
    }
}

3. 配置Laravel的CORS允许凭据传递

由于使用了credentials: "include",需要确保Laravel的CORS配置允许携带凭据:
修改config/cors.php:

return [
    'paths' => ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['http://localhost:5173'], // 替换为你的前端地址
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true, // 开启这一项
];

4. 给控制器添加数据验证

避免非法数据导致数据库报错,在store方法中添加验证规则:

public function store(Request $request)
{
    $validatedData = $request->validate([
        'user_id' => 'required|exists:users,id',
        'wpm_score' => 'required|integer|min:0',
    ]);

    UserScore::create($validatedData);

    return response()->json(['message' => '分数保存成功'], 201);
}

5. 查看Laravel日志定位深层问题

如果以上步骤仍未解决,直接查看Laravel的日志文件storage/logs/laravel.log,里面会记录500错误的详细堆栈信息,是排查服务器端问题最直接的方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:21:01