2014-07-19 13 views
11

Ho una configurazione di progetto MEAN abbastanza standard con il generatore angolare-fullstack che utilizza yeoman.Pezzi duplicati sulla risposta JSON

Quello che sto trovando è che quando ottenere un abbastanza grande (più di 65536 bytes) risultato JSON, è codificato utilizzando gzip e chunked, ma il JSON restituito non è valida visto sia in cromo o consumate dal mio cliente angolare $ risorsa perché contiene le risposte DUE! ad esempio {name:'hi'}{name:'hi'} per un singolo ID o [{..},{..}][{..},{..}] per un array.

L'endpoint server di api è stato generati automaticamente dal generatore angolare fullstack e appare come:

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

Se mi taglierò i dati in modo non è chunked, poi il JSON è ben formato. Ho controllato il dongo mongo e anche i dati sono ok e debugging la variabile worlds, posso JSON.stringify e ottenere il risultato della stringa attesa senza duplicati. ma nel momento in cui viene inviato, sto ottenendo un raddoppio del risultato JSON sulla risposta.

Aggiornamento per un commento

angolare fullstack 2.0.4

lo schema assomiglia:

'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); 

seminato con:

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; 
} 
+0

Quale versione di af stai usando? Puoi pubblicare un modello e i dati seme? –

+0

@AndyGaskell ha aggiornato la domanda, anche se non penso che i dati siano il problema dato che sono in grado di recuperare la struttura prevista con un set di dati più piccolo a patto che non ci sia chunking – Joe

+0

Non sarebbe correlato a quello di Mongo [ GridFS] (http://docs.mongodb.org/manual/core/gridfs/)? – Goodzilla

risposta

8

Sembra che questo è stato causato dal middleware di compressione, la rimozione app.use(compression()); dal config espressa sembra risolvere il problema.

+0

hey! DaftMonk :) grazie per il generatore angolare fullstack, ho imparato un sacco di buone pratiche solo dal vedere come hai costruito i controller server/client, socket, modelli ecc. Ecc. – Joe

+0

re la tua risposta, sì lo risolve, ma aumenta le dimensioni del trasferimento di 10 volte, non è l'ideale ma, ehi, io non sono un ragazzo avido, questo è abbastanza buono. Suona come non la causa principale però? – Joe

+0

La correzione è per questo se stai usando 'yo-angular-fullstack' (PS grazie per il fantastico lavoro!) O il modulo' connect-livereload' era per aggiornare 'connect-livereload' alla versione più recente'> = 0.4 .1' Vedere i commenti nella [questione qui] (https://github.com/expressjs/compression/issues/20#issuecomment-121787739) –

0

fa questo lavoro per voi ? Non vedo una ragione per cui non dovrebbe.
Suppongo che tu abbia un oggetto pianeta che ha:
HEIGHT, WIDTH e _objectId proprietà.

Ricordare che se si modifica un tipo misto è necessario indicare a mangusta il valore modificato e successivamente salvarlo.
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(); 
+2

Bit scomodo dove sta andando la risposta perché, come indicato nella domanda, non ho problemi con la mangusta, creando/salvando i dati su mongodb o scaricandoli nel mio controller di nodo. È solo quando invio i dati al client che la risposta ritiene ragionevole duplicare i blocchi. Non vedo come questo sia molto diverso da come memorizzo/aggiorno i dati o come questo influenzerà la risposta. Anche quando ho fatto questo: 'res.json (200, JSON.stringify (mondi));' Stavo ancora ricevendo problemi. Questo è solo l'invio di una stringa indietro, nessun rapporto con la mangusta più. – Joe

+0

Wow, è davvero strano. Vedrò se riesco a migliorare la risposta dopo aver replicato i risultati –

+0

Non riesco a replicare, il bug è da qualche altra parte, non credo sia nel database, ma più probabilmente nel metodo di compressione. Potresti fare un esempio con il codice minimo? D'altra parte, penso che si possa applicare una patch con questo: 'var json = JSON.stringify (mondi); res.json (200, json.substr (0, json.length/2)); 'È brutto ma dovrebbe funzionare. –

1

Il problema si verifica nei browser e non nel postino. Ho controllato le intestazioni delle richieste HTTP e quando aggiungo 'Accept' Header come html nel postman lo stesso problema è visto anche nel postman. Quindi credo che i browser stiano gestendo diversamente con Accept type con html.

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

mi sono imbattuto lo stesso problema quando si costruisce la mia app angolare fullstack (grazie, DaftMonk), dopo un po 'estesa di debug usando nodo-ispettore, si rivela i dati JSON viene passato al modulo livereload e viene duplicata quando viene fuori. Disabilitare questo middleware ha eliminato il problema per me.