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?
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);
});
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
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.
suggestion de présentation.