2012-03-31 21 views
48

मैं इस तरह से json के रूप में नेवला डॉक्स लौटे:Convert नेवला डॉक्स JSON के

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

हालांकि, उपयोगकर्ता .__ proto__ भी वापस आ गया था। मैं इसके बिना कैसे वापस आ सकता हूं? मैं इस कोशिश की, लेकिन नहीं काम किया:

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

उत्तर

93

तुम भी mongoosejs के lean() कोशिश कर सकते हैं:

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

ठीक है, यह उत्तर लगता है। –

+5

यह नहीं होना चाहिए: 'JSON।स्ट्रिंग (उपयोगकर्ता); 'चूंकि' दुबला() 'के साथ लौटाए गए दस्तावेज़ सादे जेएस ऑब्जेक्ट्स हैं? – enyo

+0

हाँ, आप सही हैं, धन्यवाद। JSON.stringify (उपयोगकर्ताओं) का उपयोग किया जाना चाहिए। – ecdeveloper

21

सबसे पहले, toJSON() शायद के बजाय toObject() कोशिश?

दूसरे, आप तो शायद अधिक इस तरह से परेशान कुछ कोशिश, वास्तविक दस्तावेजों और नहीं सरणी पर कॉल करने के लिए की आवश्यकता होगी:

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

यह एक अनुमान है, लेकिन मुझे आशा है कि यह मदद करता है

+0

यह इतना कष्टप्रद है मैप करने के लिए होने वहाँ पुस्तकालय में कुछ है कि ऐसा करने के लिए नहीं है? – Antoine

5

मुझे पता चला कि मैंने गलती की है। ऑब्जेक्ट() या toJSON() को कॉल करने की कोई आवश्यकता नहीं है। प्रश्न में __proto__ jquery से आया, मोंगोस नहीं। यहां मेरा परीक्षण है:

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() एक डॉक्टर से doc.prototype को हटा देता है। लेकिन यह JSON.stringify (डॉक्टर) में कोई फर्क नहीं पड़ता। और इस मामले में इसकी आवश्यकता नहीं है।

37

देर जवाब लेकिन आप भी इस जब अपने स्कीमा को परिभाषित करने की कोशिश कर सकते हैं।

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

ध्यान दें कि ret JSON'ed वस्तु है, और यह नेवला मॉडल का एक उदाहरण नहीं है। आप गेटर्स/सेटर्स के बिना ऑब्जेक्ट हैश पर सीधे उस पर काम करेंगे।

और फिर:

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

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

संपादित करें: फरवरी 2015

क्योंकि मैं याद आ रही toJSON (या toObject) विधि (रों) के लिए एक समाधान प्रदान नहीं किया मैं के बीच का अंतर समझा जाएगा मेरा उपयोग उदाहरण और ओपी का उपयोग उदाहरण।

ओपी:

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

मेरे उदाहरण:

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

यह जाने का सबसे अच्छा तरीका है। –

+0

toJSON() परिभाषित नहीं – OMGPOP

+0

@eAbi दोनों toJSON और toObject परिभाषित नहीं हैं – OMGPOP

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

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

से छुटकारा पाना चाहते हैं तो यह हैकी लगता है लेकिन काम करता है! – sidonaldson

+0

यह इस प्रश्न के लिए सबसे अच्छा जवाब है। लगता है कि 'जादू' जो मोंगोस के तकनीकी क्षेत्रों को छुपाता है वह JSON.stringify के पीछे कहीं छिपा हुआ प्रतीत होता है। – mischka

0

आप किसी भी वस्तु jsonify को res.json() का उपयोग कर सकते हैं। दुबला() नेवला क्वेरी में सभी रिक्त फ़ील्ड निकाल देंगे।

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

0

इस विकल्प का प्रयास करें:,

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