web-dev-qa-db-fra.com

Comment utiliser la mangouste findOne

J'ai le schéma ci-dessous (excuses qu'il est dans coffeescript)

Schema = mongoose.Schema

AuthS = new Schema
    auth:   {type: String, unique: true}
    nick:   String
    time:   Date
Auth = mongoose.model 'Auth', AuthS

Je veux simplement récupérer un enregistrement qui est définitivement dans ma base de données:

Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });

Malheureusement, cela enregistre toujours null. db.auths.findOne({nick: 'noname'}) in mongo Shell renvoie toujours une valeur. Que se passe-t-il? 

37
Callum Rogers

Trouvé le problème, besoin d'utiliser function(err,obj) à la place:

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
73
Callum Rogers

Vous voudrez peut-être envisager d'utiliser console.log avec l'objet "arguments" intégré:

console.log(arguments); // would have shown you [0] null, [1] yourResult

Tous vos arguments seront toujours affichés, quel que soit le nombre d'arguments que vous avez.

2
Neil Guy Lindberg

Utilisez obj [0] .nick et vous obtiendrez le résultat souhaité.

0
NaturalCoder

Mongoose encapsule fondamentalement l’API de mongodb pour vous donner une pseudo-api relationnelle de base de données afin que les requêtes ne soient pas exactement comme mongodb a. La requête Mongoose findOne renvoie un objet de requête, pas un document. Vous pouvez soit utiliser un rappel, comme le suggère la solution, ou à partir de la v4 + findOne renvoie une variable alors vous pouvez utiliser .then ou wait/async pour récupérer le document.

// thenables
Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(result)});

// To use a full fledge promise you will need to use .exec()
var auth = Auth.findOne({nick: 'noname'}).exec();
auth.then(function (doc) {console.log(doc)});

// async/await
async function auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

Voir les docs si vous souhaitez utiliser une bibliothèque de promesses tierce.

0
Isaac Pak