Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $.ajax():responseText正确,但报告了错误。为什么?_Javascript_Jquery_Ruby On Rails - Fatal编程技术网

Javascript $.ajax():responseText正确,但报告了错误。为什么?

Javascript $.ajax():responseText正确,但报告了错误。为什么?,javascript,jquery,ruby-on-rails,Javascript,Jquery,Ruby On Rails,我正在尝试从我的服务器获取一些JSON数据,如下所示: var a = $.ajax({ url: "data.json", dataType: 'json', data: null, error: function(data) { console.log("error"); }, success: function(data) { console.log("success"); } }); 执行此操作时,

我正在尝试从我的服务器获取一些JSON数据,如下所示:

var a = $.ajax({
    url: "data.json",
    dataType: 'json',
    data: null,
    error: function(data) {
        console.log("error");
    },
    success: function(data) {
        console.log("success");
    }
});
执行此操作时,将调用
error
函数(
error
打印到控制台)

但奇怪的是,当我检查
a
时,我发现返回了正确的响应文本

a

readyState: 4
responseText: "contents of data.json!"
status: 200
statusText: "OK"

发生什么事了?如果请求成功,为什么不触发成功回调?

可能是因为返回的特定值不是您指定的类型。响应本身是成功的(正如您通过查看“a”的详细信息所看到的),但这并不是执行成功还是错误的唯一决定因素。您将json指定为“数据类型”(返回类型),但收到一个字符串。对于测试来说,这很好,但正如您所看到的,事情不会按预期运行。如果不指定dataType选项,jQuery将通过查看mime类型和响应的内容来尝试确定返回的内容类型。当它们不匹配时,这是一个错误(如您的情况)

更新:

我意识到我在上面的解释中漫无边际。虽然你似乎解决了这个问题,但让我再详细说明一下

在您的情况下,有几种可能发生错误。需要理解的重要一点是,如果设置“dataType”,jQuery将尝试用该类型解析responseText。如果不设置该选项,它将猜测并相应地解析它(这意味着它将查看MIME类型),并以这种方式解析它。如果指定“数据类型”,则responseText需要采用JSON格式。因此,如果指定“json”,但提供一个字符串(在您的示例中),jQuery解析将失败。如果未指定“数据类型”和jQuery猜测,则responseText需要与MIME类型匹配。因此,当MIME类型为“application/json”时,不能返回字符串。当事情不匹配时,就会出现错误


希望这有帮助

只是一种预感,但是返回的内容类型是“application/json”吗?我的直觉是,错误在于JSON应该返回,但它返回的是文本/html(或其他一些内容类型),然后没有被解析。

响应文本是有效的JSON吗?您可以用@ianpgall的答案进行检查。@ianpgall的答案是正确的,但您还应该注意,在您的选项对象(第6行)的末尾有一个额外的逗号。这一点很好@harrison_m 34,但至少在较新的浏览器中,这在javascript中似乎不是一个错误。我在旧版本的IE(可能也更新了)中看到了这种突破。制作一个简单的网页,并测试出来,不应该有一个error@harrison_m谢谢你接电话。我刚刚把逗号删掉了。最后一句应该是“返回的字符串不能被解析为JSON”吗?谢谢@ianpgall。这就解决了!(我在我的问题中插入了虚拟文本。我的实际字符串看起来更像JSON,但它有一些小怪癖,使它无法通过JSONLint测试。)@alex我不知道,但我更新了我的答案:)很高兴它能帮助OP,希望它有意义。