2012-03-31 15 views
48

I Mungo docs als json auf diese Weise zurück:Convert Mongoose docs JSon

UserModel.find({}, function (err, users) { 
    return res.end(JSON.stringify(users)); 
} 

jedoch Benutzer .__ proto__ wurde ebenfalls zurückgegeben. Wie kann ich ohne es zurückkehren? Ich habe versucht, dies aber nicht funktioniert:

UserModel.find({}, function (err, users) { 
    return res.end(users.toJSON()); // has no method 'toJSON' 
} 

Antwort

93

Sie können auch mongoosejs versuchen lean():

UserModel.find().lean().exec(function (err, users) { 
    return res.end(JSON.stringify(users)); 
} 
+0

OK, es scheint die Antwort zu sein. –

+5

Sollte es nicht sein: 'JSON.stringify (users); 'da die mit' lean() 'zurückgegebenen Dokumente einfache JS-Objekte sind? – enyo

+0

Ja, du hast Recht, danke. JSON.stringify (Benutzer) sollte verwendet werden. – ecdeveloper

21

Zunächst einmal versuchen toObject() statt toJSON() vielleicht?

Zweitens müssen Sie es auf die tatsächlichen Dokumente rufen und das Array nicht, vielleicht etwas mehr ärgerlich wie diese versuchen:

var flatUsers = users.map(function() { 
    return user.toObject(); 
}) 
return res.end(JSON.stringify(flatUsers)); 

Es ist eine Vermutung, aber ich hoffe, es

+0

hat, zu kartieren es so ärgerlich ist nicht da ist etwas in der Bibliothek, das zu tun? – Antoine

5
hilft

Ich habe herausgefunden, dass ich einen Fehler gemacht habe. Sie müssen toObject() oder toJSON() überhaupt nicht aufrufen. Der __proto__ in der Frage kam von jQuery, nicht von Mungo. Hier ist mein Test:

UserModel.find({}, function (err, users) { 
    console.log(users.save); // { [Function] numAsyncPres: 0 } 
    var json = JSON.stringify(users); 
    users = users.map(function (user) { 
     return user.toObject(); 
    } 
    console.log(user.save); // undefined 
    console.log(json == JSON.stringify(users)); // true 
} 

doc.toObject() entfernt doc.prototype aus einem doc. Aber es macht keinen Unterschied in JSON.stringify (doc). Und das ist in diesem Fall nicht nötig.

37

Späte Antwort, aber Sie können dies auch versuchen, wenn Ihr Schema zu definieren.

/** 
* toJSON implementation 
*/ 
schema.options.toJSON = { 
    transform: function(doc, ret, options) { 
     ret.id = ret._id; 
     delete ret._id; 
     delete ret.__v; 
     return ret; 
    } 
}; 

Beachten Sie, dass ret ist das JSON'ed Objekt, und es ist nicht eine Instanz des Mungo-Modell. Sie arbeiten direkt an Objekt-Hashes, ohne Getter/Setter.

Und dann:

Model 
    .findById(modelId) 
    .exec(function (dbErr, modelDoc){ 
     if(dbErr) return handleErr(dbErr); 

     return res.send(modelDoc.toJSON(), 200); 
    }); 

bearbeiten: Nov 2015

Weil ich nicht eine Lösung für die fehlenden toJSON (oder toObject) Methode (n) vorsah werde ich den Unterschied erklären zwischen mein Anwendungsbeispiel und das Anwendungsbeispiel von OP.

OP:

UserModel 
    .find({}) // will get all users 
    .exec(function(err, users) { 
     // supposing that we don't have an error 
     // and we had users in our collection, 
     // the users variable here is an array 
     // of mongoose instances; 

     // wrong usage (from OP's example) 
     // return res.end(users.toJSON()); // has no method toJSON 

     // correct usage 
     // to apply the toJSON transformation on instances, you have to 
     // iterate through the users array 

     var transformedUsers = users.map(function(user) { 
      return user.toJSON(); 
     }); 

     // finish the request 
     res.end(transformedUsers); 
    }); 

Mein Beispiel:

UserModel 
    .findById(someId) // will get a single user 
    .exec(function(err, user) { 
     // handle the error, if any 
     if(err) return handleError(err); 

     if(null !== user) { 
      // user might be null if no user matched 
      // the given id (someId) 

      // the toJSON method is available here, 
      // since the user variable here is a 
      // mongoose model instance 
      return res.end(user.toJSON()); 
     } 
    }); 
+3

Es ist der beste Weg zu gehen. –

+0

toJSON() nicht definiert – OMGPOP

+0

@eAbi toJSON und toObject sind nicht definiert – OMGPOP

11
model.find({Branch:branch},function (err, docs){ 
    if (err) res.send(err) 

    res.send(JSON.parse(JSON.stringify(docs))) 
}); 
+0

loswerden möchten Dieses fühlt sich hacky aber funktioniert! – sidonaldson

+0

Dies ist die beste Antwort für diese Frage. Die "Magie", die die technischen Bereiche des Mangos versteckt, scheint irgendwo hinter JSON.stringify versteckt zu sein. – mischka

0

können Sie verwenden res.json() jedes Objekt jsonify. mager() entfernt alle leeren Felder in der Mungo-Abfrage.

UserModel.find().lean().exec(function (err, users) { return res.json(users); }

0

diese Optionen Versuchen:

UserModel.find({}, function (err, users) { 
    return res.end(JSON.parse(JSON.stringify(users))); 
    //Or: 
    //return JSON.parse(JSON.stringify(users)); 
    }