Ответ 1
Похоже, что это вызвано промежуточным программным обеспечением сжатия, удаление app.use(compression());
из экспресс-конфигурации, похоже, устраняет это.
У меня есть стандартная настройка проекта 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;
}
Похоже, что это вызвано промежуточным программным обеспечением сжатия, удаление app.use(compression());
из экспресс-конфигурации, похоже, устраняет это.
Проблема просматривается в браузерах, а не в почтальоне. Я проверил заголовки HTTP-заголовков, и когда я добавляю заголовок "Accept" как html в почтальоне, та же проблема наблюдается и в почтальоне. Поэтому я считаю, что браузеры обрабатывают по-разному с помощью типа Accept с html.
Это работает для вас? Я не вижу причины, почему это не должно быть.
Я предполагаю, что у вас есть объект планеты, который имеет:
Свойства 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();
// app.use(require('connect-livereload')());
Я столкнулся с той же проблемой при создании моего приложения angular -fullstack (спасибо, DaftMonk), после некоторой расширенной отладки с использованием node -инспектора, данные JSON передаются в модуль livereload
и получают дублируется, когда он выходит. Отключение этого промежуточного программного обеспечения устранило проблему для меня.