JSON响应上的重复块

时间:2014-07-19 02:10:49

标签: javascript json node.js angularjs chunked-encoding

我使用yeoman的angular-fullstack生成器有一个相当标准的MEAN项目设置。

我发现的是,当获取一个较大的(超过65536字节)json结果时,它使用gzip和chunked进行编码,但返回的json无效,无论是在chrome中查看还是由我的角度客户端使用$ $资源,因为它包含 TWO 响应! 例如{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;
}

4 个答案:

答案 0 :(得分:8)

看起来这是由压缩中间件引起的,从快速配置中删除app.use(compression());似乎解决了这个问题。

答案 1 :(得分:1)

问题出现在浏览器中而不是邮递员中。我检查了HTTP请求标头,当我添加&#39;接受&#39;在邮递员中作为html的标题也可以在邮递员中看到同样的问题。所以我认为浏览器的处理方式与使用html的Accept类型不同。

答案 2 :(得分:1)

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

在构建我的angular-fullstack应用程序时遇到了同样的问题(感谢DaftMonk),在使用node-inspector进行了一些大量调试后,结果证明JSON数据传递给livereload模块并在复制时重复它出来了。禁用此中间件可以解决我的问题。

答案 3 :(得分:0)

这对你有用吗?我不明白为什么不应该这样做 我假设你有一个行星物体,它有:
HEIGHTWIDTH_objectId属性。

请记住,如果您修改混合类型,则需要告诉mongoose 值已更改并随后保存。
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();