0
votes

Async attendre échoue dans le nœud.js lorsque le client se connecte au serveur

Lorsque mon client réagissant se connecte au serveur:

index.js: xxx

Il va à la base de données:

mongodub.js: xxx

Cependant db_images est toujours indéfini, même si les données reviennent correctement (J'ai vérifié avec "console.log" dans la méthode getallimages ).

Où est-ce que je me suis trompé avec la demande?


2 commentaires

Await DBO.Collection (). Trouver ({})


attendre ne fait que quelque chose d'utile lorsque vous êtes attendre une promesse. Await MongoClient.Connect (URL, Fonction (ERR, DB) {...}) N'attend pas une promesse. Même problème dans votre dbo.collection (). Trouver () . Vous devez utiliser l'interface de promesse dans votre base de données avec attendre , pas l'interface de rappel ordinaire. attendre 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.


3 Réponses :


2
votes

La fonction getallimages ne renvoie pas votre valeur. Il revient simplement ce que la méthode méthode .

puisque vous utilisez attendre pour appeler la fonction getallimages , renvoyer une promesse et le résoudre avec votre valeur. xxx

Cependant, le motif le plus précis consiste à utiliser l'interface promesse native de votre bibliothèque comme indiqué par JFID00 dans un commentaire.


5 commentaires

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 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 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 () retourne une promesse. Vous pouvez également utiliser une promesse avec .Find () .



1
votes

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


2 commentaires

Merci, mais vous ne retournez pas une promesse, vous retour json.stringify (résultat);


Chaque fonction ASYNC renvoie une promesse, alors quand nous reviendrons, il retourne une promesse



1
votes

Votre code actuel tente d'utiliser 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.

Voici ce que je suggérerais: P>

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


0 commentaires