Не удается получить JSON In Backbone collection

У меня есть следующий код Backbone.js

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

а затем, на мой взгляд, я пытаюсь сделать следующее, чтобы получить JSON из API и заполнить модели

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 файл, чтобы он определенно был там, и когда я открою его новую строку с разделителями. Ниже приведен фрагмент кода api, который отправляет JSON

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, ответ, который я получаю, просто кажется случайным символом, и я получаю сообщение об ошибке "СинтаксисError: JSON.parse: Неожиданный символ"

eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2

Ответ 1

Ваш цикл записи ответа генерирует недопустимую строку 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));

Ответ 2

Обычно, когда вы получаете сообщение об ошибке JSON.parse: неожиданный символ, это указывает, что атрибуты JSON не имеют квалификацию с двойными кавычками, поэтому в основном JSON может выглядеть так:

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

Или даже это:

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

Вместо этого:

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

Или это:

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

Ответ 3

Прежде всего. У вас проблемы с конфигурацией сервера. Похоже, что ваш тип mime не установлен, и у вас есть (возможно, gzip) сжатие включено.

Используйте Google Chrome, чтобы перейти к URL-адресу, который обслуживает JSON. Браузер должен отображать JSON в виде обычного текста, не запрашивая его для его загрузки.

Затем добавьте расширение JSONView для Chrome. Перейдите к URL-адресу, который обслуживает JSON. Вы должны увидеть JSON в "хорошем" формате с соответствующими фигурными скобками.

После этого вернитесь в свое веб-приложение и проверьте. Если у вас все еще есть проблемы, отправьте информацию о своем веб-сервере (тип и версию) и любую другую специальную информацию. Мы пойдем оттуда.