Quelle est la bonne façon de faire un synchrones MongoDB requête en Node.js?
Je suis en utilisant le Node.JS pilote pour MongoDB, et j'aimerais effectuer une requête synchrone, comme tel:
function getAThing()
{
var db = new mongo.Db("mydatabase", server, {});
db.open(function(err, db)
{
db.authenticate("myuser", "mypassword", function(err, success)
{
if (success)
{
db.collection("Things", function(err, collection)
{
collection.findOne({ name : "bob"}, function(err, thing)
{
return thing;
});
});
}
});
});
}
Le problème est, db.open est une asychronous appel (il n'a pas de bloc), de sorte que le getAThing retourne "undefined" et je veux qu'il renvoie les résultats de la requête. Je suis sûr que j'aurais une sorte de mécanisme de blocage, mais je voudrais connaître la bonne façon de faire quelque chose comme cela.
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun moyen de faire ce synchrone w/o une sorte de terrible hack. La bonne façon est d'avoir
getAThing
accepter une fonction de rappel en tant que paramètre et ensuite appeler cette fonction à la foisthing
est disponible.Nœud De 7,6+ Mise À Jour
async
/attendre
maintenant fournit un moyen de codage synchrone style lors de l'utilisation des Api asynchrones que le retour des promesses (comme le natif de MongoDB pilote n').À l'aide de cette approche, la méthode ci-dessus peut être écrite comme:
Que vous pouvez ensuite appeler à partir d'un autre
async
fonctionlet thing = await getAThing();
.Cependant, il est intéressant de noter que
MongoClient
fournit un pool de connexion, de sorte que vous ne devriez pas être d'ouverture et de fermeture à l'intérieur de cette méthode. Au lieu de cela, appelezMongoClient.connect
au cours de votre application de démarrage, puis simplifier votre méthode:Noter que nous ne les appelons pas
await
dans la méthode, au lieu de retourner directement à la promesse qui est renvoyé par lefindOne
.if_exists()
fonction... Btw, si quelqu'un connaît un moyen plus facile, ou une mise à jour du pilote, veuillez le poster ici.thing
est un '[objet de la Promesse]'. Comment pouvons-nous lire les données à l'intérieur de la promesse de l'objet? (sans.then
de rappel)await
la promesse de l'intérieur d'une autreasync
fonction:let thing = await getAThing();
function(err, result) { if (err) { res.send(err) } else { // do things }
- comment gérez-vous/voir une erreur qui provientlet thing = await db.collection.findOne(query)
?await
vous devez utiliser les blocs try/catch pour le traitement des erreurs.try { var bob = await getAThing() } catch(err) { console.log("mongodb query error is here: " + err ) }
ES 6 (Nœud 8+)
Vous pouvez utiliser async/await
await
opérateur interrompt l'exécution de fonctions asynchrones jusqu'à ce que la Promesse est résolu et renvoie la valeur.De cette façon, votre code fonctionne de façon synchrone:
Les Plus Âgés De La Solution - Juin 2013 😉
Maintenant la Mongo Sync est disponible, c'est la bonne façon de faire un synchrones MongoDB requête en Node.js.
Je me sers de ce pour la même chose. Il vous suffit d'écrire la méthode sync comme ci-dessous:
Note: Sa dépend de la nœud en fibre de et certaines questions sont là avec sur windows 8.
Heureux de codage 🙂
Alors qu'il n'est pas strictement synchrone, un modèle que j'ai à plusieurs reprises adopté et a trouvé très utile est d'utiliser co et promisify rendement asynchrone fonctions. Pour mongo, vous pouvez réécrire la ci-dessus:
Cela signifie: