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?
Trouvé le problème, besoin d'utiliser function(err,obj)
à la place:
Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
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.
Utilisez obj [0] .nick et vous obtiendrez le résultat souhaité.
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.