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

Laravel框架下AJAX请求返回正常但不进入success函数问题求助

问题描述

首先我先分享相关代码:

视图/Form

<form id="xlsForm" enctype="multipart/form-data">
    @csrf
    <input class="btn btn-primary" id="loadFile" type="file" name="excelfile" accept=".xls,.xlsx,.docx,.doc" required/>
    <input type ="hidden" name="load" value="0">
    <button  class="btn btn-light" name ="loadSubmit" id="loadSubmit" type="submit" value ="Analyze">Analyze</button>
</form>

JQuery代码

$('#xlsForm').submit(function uploadFile(event) {
    event.preventDefault();
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
        }
    });
    $('#loader').show();
    $.ajax({
        url: "{{route('ExcelToArray')}}",
        method: 'POST',
        data: new FormData(this),
        dataType: 'JSON',
        contentType: false,
        cache: false,
        processData: false,
        success: function (response) {
            console.log("entered response")
            $("#inner").empty();
            $.each(response.like_values, function (index, value) {
                $("#inner").append('<div class="row">' +
                    '<div class="col-xs-6">' +
                    '<input class="' + value + '" data-name="' + value + '" type="number" name="weight[' + value + ']" min="1" max="3" value="1" style="text-align:center"> ' +
                    '</div>' +
                    '<div class="col-xs-6"  style="padding-left: 9px">' +
                    '<input type="checkbox"  data-name="' + value + '" class="checkbox" value="' + value + '" name="checkbox[' + value + ']"  checked >  ' +
                    '<label style="color:' + response.color[value] + '; font-weight: bold" for="skillChoice_' + index + '">' + value + ' </label>' +
                    '</div>' +
                    '</div>');
            });
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('jqXHR is : ' + jqXHR.value
                + 'textStatus is : ' + textStatus
                + ' errorThrown is : ' + errorThrown);
        },
        complete: function () {
            console.log("entered complete")
            $('#loader').hide();
            load_employees()
        },
    });
});

控制器返回逻辑

控制器其余代码不做展示,方法最后执行的返回逻辑如下:

return response()->json(['like_values' => $like_values,'color' => $color,]);

现象与问题

这段逻辑运行正常,在Chrome浏览器网络面板中可以查看到返回的like_values和color数据均正常。但AJAX的success函数没有被触发,返回的数组无法遍历。这段代码之前可正常运行,现在未知原因失效。收到的报错信息如下:

SyntaxError: Unexpected token s in JSON at position 0

推测问题和该报错相关,请问问题出在哪里?


解决方案

这个报错的核心原因是指定了AJAX的dataType: 'JSON',但后端返回的内容不是纯JSON格式,开头多了非JSON字符(报错里提到的s就是返回内容的第一个字符)。Chrome网络面板展示的返回数据是经过格式化过滤的,可能隐藏了不可见的多余字符或者前置输出,实际返回给AJAX的内容不符合JSON规范。
可按以下步骤排查:

  1. 临时把AJAX请求的dataType改为text,在success回调中打印完整的返回内容,就能直接看到开头多余的字符,定位输出源。
  2. 检查控制器返回JSON之前有没有额外输出:比如echo、var_dump之类的调试代码没有删除,或者引用的PHP文件开头/结尾存在PHP标签外的多余空格、换行,甚至是UTF-8的BOM头。
  3. 如果用的是Laravel框架,可以在返回JSON之前加一行ob_end_clean()清空输出缓冲区,避免之前的多余输出污染JSON内容,修改后返回代码参考:
ob_end_clean();
return response()->json(['like_values' => $like_values,'color' => $color,]);
  1. 检查对应路由绑定的前置中间件有没有额外输出操作,比如权限校验、日志打印的输出逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:15:04