无法在主干集合中获取 JSON

Can't fetch JSON In Backbone collection

本文关键字:获取 JSON 集合      更新时间:2023-09-26

我有以下骨干.js代码

var List = Backbone.Collection.extend({
    model: Item,
    url: '/api/items',
});

然后在我看来,我正在尝试执行以下操作以从 API 获取 JSON 并填充模型

this.collection = new List();
var that = this;
this.collection.fetch({
    success: function () {
        that.render();
        console.log('Fetch successful!');
    },
    error: function() {
        console.log('Failed to fetch!');
    }
});
但是,获取

不起作用,并触发"无法获取!"消息。 谁能看到我做错了什么? 如果我转到浏览器中的api/items,系统会提示下载 JSON 文件,因此它肯定在那里,当我打开它时,它的新行分隔。 下面是发送回 JSON 的 API 代码片段

res.writeHead(200, {
    'Content-Type': 'application/x-json-stream'
});
setTimeout(function () {
    var i;
    for (i=0; i<limit; i+=1) {
        res.write(JSON.stringify(createRandomItem(i+skip, sort)) + ''n');
    }
    res.end();
}, 100 + Math.floor(Math.random() * 3000));

此外,当我使用开发人员工具检查发送到 API 的请求时,我得到的响应似乎只是随机字符,并且我收到错误"语法错误:JSON.parse:意外字符"

eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2

响应写入循环会生成无效的 json 字符串,因为它只是连接 json 对象。

您可以收集数组中的所有对象并像这样将其字符串化:

setTimeout(function () {
    var i, data = [];
    for (i=0; i<limit; i+=1) {
        data.push(createRandomItem(i+skip, sort));
    }
    res.write(JSON.stringify(data));
    res.end();
}, 100 + Math.floor(Math.random() * 3000));

通常,当您收到 JSON.parse: 意外字符错误时,它表示 JSON 属性不是双引号限定的,因此基本上 JSON 可能如下所示:

"{ test: 1, testing: 2 }"          *Invalid*

甚至这个:

"{ 'test': 1, 'testing': 2 }"      *Invalid*

而不是这样:

'{ "test": 1, "testing": 2 }'      *Valid*

或者这个:

"{ '"test'": 1, '"testing'": 2 }"  *Valid*

一件事是第一件事。 您肯定有服务器配置问题。 听起来您的 MIME 类型未设置,并且您启用了(可能是 gzip)压缩。

使用谷歌浏览器浏览到提供 JSON 的网址。 浏览器应以纯文本形式显示 JSON,而不会提示您下载它。

接下来获取Chrome的JSONView扩展。浏览到提供 JSON 的 URL。 您应该看到带有匹配大括号的"漂亮"格式的 JSON。

完成此操作后,返回到 Web 应用并进行测试。 如果仍然遇到问题,请发布您的 Web 服务器信息(类型和版本)以及任何其他特殊信息。 我们将从那里开始。