96 votes

Convertir la documentation de Mongoose en json

J'ai retourné les documents de Mongoose en json de cette façon :

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

Cependant, user.__proto__ a également été renvoyé. Comment puis-je retourner sans cela ? J'ai essayé mais ça n'a pas marché :

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

169voto

ecdeveloper Points 545

Vous pouvez également essayer la méthode de mongoosejs maigre() :

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

9 votes

Ça ne devrait pas l'être : JSON.stringify(users); depuis que les docs ont retourné avec lean() sont de simples objets JS ?

0 votes

Oui, vous avez raison, merci. Il faut utiliser JSON.stringify(users).

0 votes

Si vous souhaitez toujours utiliser l'objet d'instance de la mangouste dans la fonction de rappel après avoir interrogé la base de données, vous ne devez pas utiliser l'option lean fonction. Voir ma réponse pour la solution :)

60voto

eAbi Points 416

Réponse tardive mais vous pouvez aussi essayer ceci lors de la définition de votre schéma.

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

Notez que ret est l'objet JSON'ed, et ce n'est pas une instance du modèle de la mangouste. Vous opérerez sur lui directement sur des hachages d'objets, sans getters/setters.

Et puis :

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

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

Edit : Feb 2015

Comme je n'ai pas fourni de solution pour la ou les méthodes toJSON (ou toObject) manquantes, je vais expliquer la différence entre mon exemple d'utilisation et celui de l'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);
    });

Mon exemple :

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

29voto

Jamund Ferguson Points 6338

Tout d'abord, essayez toObject() au lieu de toJSON() peut-être ?

Deuxièmement, vous devrez l'appeler sur les documents réels et non sur le tableau, alors essayez peut-être quelque chose de plus ennuyeux comme ceci :

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

C'est une supposition, mais j'espère que ça aidera.

0 votes

Devoir le cartographier est si ennuyeux, n'y a-t-il pas quelque chose dans la bibliothèque pour le faire ?

17voto

Fabio Guerra Points 79
model.find({Branch:branch},function (err, docs){
  if (err) res.send(err)

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

0 votes

C'est la meilleure réponse à cette question. La "magie" qui masque les champs techniques de la mangouste semble être cachée quelque part derrière JSON.stringify.

8voto

Trantor Liu Points 878

J'ai découvert que j'ai fait une erreur. Il n'est pas du tout nécessaire d'appeler toObject() ou toJSON(). Le __proto__ dans la question vient de jquery, pas de la mangouste. Voici mon 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() supprime doc.prototype d'un doc. Mais cela ne fait aucune différence dans JSON.stringify(doc). Et ce n'est pas nécessaire dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X