Bonjour,

Je vous solicite car je bloque sur un éléments de mon code. Etant plus ou moins novice dans la domaine du javascripts, je souhaiterai avoir votre aide.

Dans le but de me familiariser avec différentes technologies et le javascript, je me suis orienté vers la création d'une application.

Environnement
  • ExpressJS (4.16.4)
  • Body parser (1.18.3)
  • Mongoose (5.3.9)
Code

Le code ci-dessous est appelé en POST


let alreadyExist = false

user.countDocuments({ email: body.email }, (error, count) => {
    if (error) throw error

    alreadyExist = (count > 0)
    console.debug('DEBUG 1 : ' + alreadyExist)
})
console.debug('DEBUG 2 : ' + alreadyExist)

if (alreadyExist) {
    // code erreur...
}
[...]
console.debug('DEBUG 3 : ' + alreadyExist) // Fin du code
Résultats

DEBUG 2 : false
DEBUG 3 : false
DEBUG 1 : false
Explications

Le code se trouve typiquement dans un formulaire d'inscription (côté serveur) et permet (normalement...) de vérifier si un utilisateur enregistré utilise déjà l'adresse email soumise.

Or, la vérification réalisée dans la fonction passé à la méthode countDocuments() s'exécute qu'à la toute fin du code, et donc me valide l'adresse email alors que cette dernière est déjà utilisée.

Ma question est donc : Comment faire pour que le code s'execute "dans l'ordre" (DEBUG 1 puis DEBUG 2 puis DEBUG 3 par exemple)

J'espère avoir été assez claire dans mes explications, si vous avez besoins de plus d'informations, j'essayerai d'y répondre dans les plus brefs délais.

Cordialement,

4 réponses


cocadev
Réponse acceptée

Salut, le (error, count) => { est une fonction de callback donc appelé après user.countDocuments si tu veux faire ce que tu attends il faudrais faire quelques chose du type

let alreadyExist = false

user.countDocuments({ email: body.email }, (error, count) => {
    if (error) throw error

    alreadyExist = (count > 0)
    console.debug('DEBUG 1 : ' + alreadyExist);

    console.debug('DEBUG 2 : ' + alreadyExist)
    if (alreadyExist) {
    // code erreur...
    }
    [...]
    console.debug('DEBUG 3 : ' + alreadyExist) // Fin du code
});

Ce qu'il se passe actuellement :

Lance l'execution de users.countDocument...
Affiche DEBUG 2
[...]
Affiche DEBUG 3
Fin de l'execution de users.countDocument, donc appelle le callback
Affiche DEBUG 1

Avec le nouveau code:

Lance l'execution de users.countDocument...
Fin de l'execution de users.countDocument, donc appelle le callback
Affiche DEBUG 1
Affiche DEBUG 2
[...]
Affiche DEBUG 3

Huggy
Réponse acceptée

Pour comprendre comment fonctionne nodejs, il faut regarder le fonctionnement de l'event loop.
Ici le code du callback est remis dans une queue qui est intérrogée lorsque le code principal est terminé
voir le schéma ici qui indique dans quel ordre sont interrogées les différentes queues

Pour avoir un ordre procédural, regarde les vidéos sur async/await

Salut,
Il faut utiliser les promises ou des callBacks ;)

a+
Pierre

Ludo46
Auteur

Bonjour,

Déjà merci de votre attention, grâce à vous, j'ai pu résoudre mon "problème" !