Подтвердить что ты не робот

Дублированные куски ответа JSON

У меня есть стандартная настройка проекта MEAN с генератором angular -fullstack, использующим yoman.

То, что я нахожу, заключается в том, что при получении большого (более 65536 байт) json-результата он кодируется с использованием gzip и chunked, но возвращенный json недопустим, просматривается либо в chrome, либо используется моим клиентом angular ресурс, потому что он содержит ДВА ответов! например, {name:'hi'}{name:'hi'} для одного id или [{..},{..}][{..},{..}] для массива.

Конечная точка сервера api была автогенерирована из генератора angular -fullstack и выглядит примерно так:

// Get list of worlds
exports.index = function(req, res) {
  World.find(function (err, worlds) {
    if(err) { return handleError(res, err); }
    res.json(200, worlds);
  });
};

Если я нарезаю данные так, чтобы они не чередовались, тогда json хорошо сформирован. Я проверил mongo db, и данные там тоже в порядке и отладка переменной worlds, я могу JSON.stringify и получить ожидаемый результат строки без каких-либо дубликатов. но в тот момент, когда он был отправлен, я получаю удвоение результата json в ответ.

Обновить для комментариев

angular -fullstack 2.0.4

схема выглядит следующим образом:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var WorldSchema = new Schema({
  name: String,
  info: String,
  active: Boolean,
  tiles: [Schema.Types.Mixed]
});

module.exports = mongoose.model('World', WorldSchema);

засеяли:

 var newWorld = new WorldModel({
                    _id: planet._objectId,
                    name: "SimDD World",
                    tiles : seed()
                });
                newWorld.save();

...

var seed = function () {
    var data = [];
    for (var i = 0; i < planet.HEIGHT; i++) {
        for (var j = 0; j < planet.WIDTH; j++) {
            data.push({
                coords:{
                    x:i,
                    y:j
                },
                type:'.'
            });
        }
    }
    return data;
}
4b9b3361

Ответ 1

Похоже, что это вызвано промежуточным программным обеспечением сжатия, удаление app.use(compression()); из экспресс-конфигурации, похоже, устраняет это.

Ответ 2

Проблема просматривается в браузерах, а не в почтальоне. Я проверил заголовки HTTP-заголовков, и когда я добавляю заголовок "Accept" как html в почтальоне, та же проблема наблюдается и в почтальоне. Поэтому я считаю, что браузеры обрабатывают по-разному с помощью типа Accept с html.

Ответ 3

Это работает для вас? Я не вижу причины, почему это не должно быть.
Я предполагаю, что у вас есть объект планеты, который имеет:
Свойства HEIGHT, WIDTH и _objectId.

Помните, что если вы изменяете смешанный тип, вам нужно сообщить мангусте что значение изменилось, а затем сохраните его.
http://mongoosejs.com/docs/schematypes.html#mixed

var WorldModel = require('../api/world/world.model');
var planet = require('planetSeedData');

var seed = function() {
  var data = [];
  for (var i = 0; i < planet.HEIGHT; i++) {
    for (var j = 0; j < planet.WIDTH; j++) {
      data.push({
        coords: {x:i, y:j},
        type: '.'
      });
    }
  }
  return data;
};

var myPlanet = {
  _id: Mongoose.Types.ObjectId(planet._objectId),
  name: "SimDD World",
  tiles : seed()
};               

WorldModel.create(myPlanet);

// if modified, you would do something like:
// WorldModel.markModified('tiles');
// WorldModel.save();

Ответ 4

// app.use(require('connect-livereload')());

Я столкнулся с той же проблемой при создании моего приложения angular -fullstack (спасибо, DaftMonk), после некоторой расширенной отладки с использованием node -инспектора, данные JSON передаются в модуль livereload и получают дублируется, когда он выходит. Отключение этого промежуточного программного обеспечения устранило проблему для меня.