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

