Partage
  • Partager sur Facebook
  • Partager sur Twitter

exploiter le resultat d'une requête mongoose

Sujet résolu
    18 juin 2021 à 10:20:04

    Bien le bonjour.

    Débutant en node.js et Express.js, je cherche à créer mon "espace membres" ( création d'un compte, connexion, ... ).

    Je potasse depuis deux ou trois jours toutes les docs que je trouve, mais rien n'y fait, pas moyen d'obtenir un résultat concret sur ma requête mongoose.
    Avec le code suivant, le serveur ne démarre carrément pas, et la console me dit :

    "SyntaxError: await is only valid in async function"
    Quelqu'un pourrait-il m'expliquer ce qui se passe?
    Jai bien essayé d'autre méthodes, mais l'utilisation d'une fonction de callback foire aussi ( le callback ne modifie pas les variables que je déclare ailleurs dans le fichier ), le mieux que j'arrive à obtenir comme réponse à ma requête est un objet promise qui est "pending" ( donc en attente, j'imagine? )

    /*
    /routes/log.js
    */
    
    var express = require('express');
    var router = express.Router();
    var util = require('util');
    var mongoose = require("mongoose");
    mongoose.connect('mongodb://localhost:27017/mydb', {useNewUrlParser: true, useUnifiedTopology: true});
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error : '));
    db.once('open', function(){console.log('connected to db')});
    
    const userSchema = new mongoose.Schema({
        pseudo: { type : String, required : true },
        password: { type : String, required : true }
    });
    
    const User = mongoose.model('user', userSchema);
    var logError;
    
    
    /* GET log page. */
    router.get('/', function(req, res, next) {
      var renderObject = { title: 'mySite logger'};
        if(req.session.user)
        {
            renderObject.user = req.session.user;
            console.log('session trouvée : ' + req.session.user);    
        }
        else
        {
            console.log('session non trouvée');
        }
        res.render('logpage', renderObject);
    });
        
    /*POST log page */
    router.post('/', function(req, res, next) {
      var renderObject = { title: 'mySite logger'};
        
        if(!req.body.postedName || !req.body.postedPass)
            console.log('il manque des éléments');
        
        if(req.body.postedName && req.body.postedPass)
        {
            console.log('posted : name="' + req.body.postedName + '", pass="' + req.body.postedPass + '"');
            if(req.session.user)
            {
                renderObject.logError = 'alreadyConnected';
                console.log('already connected');
            }
            else
            {
                //TODO : verifier l'existence de l'utilisateur et la validité du mot de passe
                
                req.session.user = req.body.postedName;
                renderObject.user = req.session.user;
                console.log(req.session.user + " id: " + req.session.id);
            }
        }
        
        if(req.body.postedNewName && req.body.postedNewPass)
        {
            if(req.session.user)
            {
                renderObject.logError = 'alreadyConnected';
                console.log('already connected');
            }
            else
            {
                const queryResult = await User.find({pseudo: req.body.postedNewName});
                console.log(queryResult); /// provoque l'erreur
            }
        }
        
        if(req.body.unsetAsked)
        {
            req.session.destroy();
        }
        
        console.log('l89: ' + util.inspect(renderObject.logError));
        res.render('logpage', renderObject);
    });
    
    module.exports = router;

    Est-ce ma requête qui est mal formulée ou autre chose dans mon code qui ne va pas? 

    -
    Edité par LucasWerquin 20 juin 2021 à 0:41:31

    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2021 à 18:17:09

      Bon, je pensais avoir trouvé, mais non, je me suis encore foiré :(

      Help please...

      -
      Edité par LucasWerquin 20 juin 2021 à 0:41:28

      • Partager sur Facebook
      • Partager sur Twitter
        20 juin 2021 à 8:22:25

        Bonjour, l'erreur que tu as au démarrage du serveur:

        "SyntaxError: await is only valid in async function"

        Indique que tu as utilisé le mot clés await en dehors d'une fonction définit avec async

        le mot clés await demande à attendre un résultat depuis une instruction asynchrone qui renvoie un objet Promise

        ce qui ajoute un sucre de syntaxe en permettant d'écrire un code plus proche d'un traitement synchrone:

        async function foobar() {
        
        	const resultat await truc();
            
            return resultat;
        }

        Là où la version verbeuse serait:

        truc()
        .then(function(resultat) {
        	// traitement du résultat ...
        })
        .catch(function(error) {
        	// traitement de l'erreur ...
        });

        En admettant que truc et une fonction qui retourne une Promise.

        Tu peut retrouvé un tutoriel vidéo d'une trentaine de minutes en français (gratuit) sur l'utilisation des Promise et des mots clés async/await sur Grafikart

        Qui font partie du javascript moderne et que tu retrouvera dans beaucoup d'API que tu utiliseras avec javascript.


        Tu peut retrouvé la documentation de mongoose ainsi que ça partie sur les requêtes et la définition de la méthode find que tu as utilisé et qui provoque l'erreur.

        Le code d'exemple montre une utilisation de await mais part du principe que tu l'utilise dans un fonction asynchrone (sinon cela ne fonctionne pas).

         De ce que j'ai compris de la documentation la méthode find (et toutes les méthodes de requêtes) retourne un objet Query

        Qui contient plusieurs méthode pour configuré la requête et une méthode exec pour l'exécuté (la méthode exec retourne une Promise avec le résultat de la requête où une erreur).

        La requête find pourrait ressemblé à:

        // construit l'objet Query <https://mongoosejs.com/docs/api/query.html#query_Query>
        const query = User.find({pseudo: req.body.postedNewName});
        
        // execute la requête avec la configuration par défaut <https://mongoosejs.com/docs/api/query.html#query_Query-exec>
        const promiseQuery = query.exec()
        
        // écoute le résultat de la Promise avec les méthode then/catch
        // <https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Promise>
        promiseQuery
        .then(function(resultat) {
            console.log(resultat);
        })
        .catch(function(error) {
            console.error(`Mongoose Query#find error: ${error.code} => ${error.message}`);
            throw new Error(error);
        });
        





        • Partager sur Facebook
        • Partager sur Twitter

        suggestion de présentation.

          20 juin 2021 à 11:41:40

          D'accord, je crois que je commence à comprendre.
          Mon problème ne réside donc pas tant dans ma gestion de la requête, mais plutôt dans ma gestion de la route log.js.

          j'ai cru comprendre que le processus conduisant à la création de la page continue sans attendre que la Promise produise un résultat ?

          En fait, si je reprend ton dernier bloc de code, à la ligne 11, le résultat sera affiché dans la console. Mais là où je ne sais pas comment procéder, c'est pour transmettre ce résultat à mon objet renderObject AVANT de procéder à l'instruction res.render('logpage', renderObject) de la ligne 83 de mon code.

          (Deux trois bidouilles plus tard )

          C'est bien ça. Je suis sur une solution où j'ai "dispatché" l'instruction res.render('logpage', renderObject) dans tous les cas traités. J'imagine que c'est pas très "propre" et je vais avoir une optimisation à faire, mais ça semble fonctionner.
          Encore une fois mille mercis pour toutes les docs fournies ( ici et par MP ).

          -
          Edité par LucasWerquin 20 juin 2021 à 12:46:01

          • Partager sur Facebook
          • Partager sur Twitter

          exploiter le resultat d'une requête mongoose

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown