Lorsque mon client réagissant se connecte au serveur:
Il va à la base de données: p > mongodub.js: strong> p> Cependant Où est-ce que je me suis trompé avec la demande? P> p> db_images code> est toujours indéfini, même si les données reviennent correctement (J'ai vérifié avec "console.log" dans la méthode code> getallimages code>). P>
3 Réponses :
La fonction puisque vous utilisez Cependant, le motif le plus précis consiste à utiliser l'interface promesse native de votre bibliothèque comme indiqué par JFID00 dans un commentaire. P> p> getallimages code> ne renvoie pas votre valeur. Il revient simplement ce que la méthode code> méthode code>.
attendre code> pour appeler la fonction
getallimages code>, renvoyer une promesse et le résoudre avec votre valeur. p>
Ne serait-il pas préférable d'utiliser l'interface de promesse réelle intégrée à la bibliothèque de la base de données?
Bien sûr. Mais j'ai juste essayé de souligner l'échec du code OPS. Merci.
Et, alors vous avez suggéré une solution qui est la mauvaise solution. Le bon correctif consiste à utiliser l'interface de promesse réelle dans la base de données, puis à utiliser attendre code> correctement.
Je viens de vérifier docs. La connexion n'a pas de promesse intégrée. De toute façon, de toute façon, l'OP devra retourner une promesse créée par lui-même. Le trouver code> bien sûr pourrait être synchrone.
Vérifiez Les docs ici . Si vous utilisez une version récente de la bibliothèque et que vous ne passez pas de rappel, alors .Connect () code> retourne une promesse. Vous pouvez également utiliser une promesse avec
.Find () code>.
Nous ne devrions pas mélanger ASYNC attendre avec des rappels, j'ai écrit le code uniquement avec ASYNC Await, et Mongoclient renvoie maintenant une promesse.
getAllImages = async (url) => { const db = await MongoClient.connect(url); if (!db) throw "An error occurred"; var dbo = db.db("PicturesDB"); const result = await dbo.collection("Images").find({}).toArray() if (!result) return "error occurred"; else return JSON.stringify(result); }
Merci, mais vous ne retournez pas une promesse, vous retour json.stringify (résultat); code>
Chaque fonction ASYNC renvoie une promesse, alors quand nous reviendrons, il retourne une promesse
Votre code actuel tente d'utiliser Voici ce que je suggérerais: P> attendre code>, mais vous n'utilisez pas l'interface de la promesse dans la base de données. Avec MongoDB, lorsque vous passez un rappel régulier à quelque chose comme
.Connect () code> ou
.toRray () code>, il ne renvoie pas une promesse, alors votre
attendre ne fait rien d'utile. Mais si vous ne passez pas du tout ce rappel (et utilisez une nouvelle version de la bibliothèque de base de données), il renvoie une promesse que vous pouvez utiliser.
app.get("/getImages" , async function(req,res) {
try {
const db_images = await mongoAPI.getAllImages();
console.log(db_images);
res.json(db_images);
} catch(e) {
// database error
console.log(e);
res.status(500).send("database error");
}
});
Await I> B> DBO.Collection (). Trouver ({})
attendre code> ne fait que quelque chose d'utile lorsque vous êtes
attendre code> une promesse.
Await MongoClient.Connect (URL, Fonction (ERR, DB) {...}) CODE> N'attend pas une promesse. Même problème dans votre
dbo.collection (). Trouver () code>. Vous devez utiliser l'interface de promesse dans votre base de données avec
attendre code>, pas l'interface de rappel ordinaire.
attendre code> n'a pas de puissances asynchrones magiques. Tout ce qu'il sait faire, c'est surveiller une promesse. Si vous ne lui donnez pas une promesse, cela ne fait rien d'utile.