我有以下Backbone.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!');
}
});
然而,提取无法正常工作,并且触发了#34;无法获取!"信息。任何人都能看到我做错的事吗?如果我在我的浏览器中转到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的请求时,我回来的响应似乎是随机字符,我收到错误&#34; SyntaxError:JSON.parse:Unexpected character& #34;
eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2
答案 0 :(得分:9)
您的响应编写循环生成无效的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));
答案 1 :(得分:4)
通常,当您收到 JSON.parse:意外字符错误时,它表示JSON属性不是双引号限定的,因此基本上JSON可能如下所示:
"{ test: 1, testing: 2 }" *Invalid*
甚至这个:
"{ 'test': 1, 'testing': 2 }" *Invalid*
而不是这样:
'{ "test": 1, "testing": 2 }' *Valid*
或者这个:
"{ \"test\": 1, \"testing\": 2 }" *Valid*
答案 2 :(得分:3)
第一件事是第一件事。你肯定有服务器配置问题。听起来你的mime类型没有设置,你有(可能是gzip)压缩启用。
使用Google Chrome浏览到提供JSON的网址。浏览器应以纯文本显示JSON,而不提示您下载。
接下来获取Chrome的JSONView扩展程序。浏览到提供JSON的URL。你应该在&#34;漂亮&#34;中看到JSON。匹配大括号的格式。
完成后,请返回您的网络应用并进行测试。如果您仍然遇到问题,请发布您的Web服务器信息(类型和版本)以及任何其他特殊信息。我们会从那里出发。