Je termine mon application simple qui permet d'enregistrer l'utilisateur puis de se connecter à la boutique. La partie enregistrement est terminée et je peux déjà mettre de nouvelles collections et documents dans le cluster mongoDB externe.

Je suis bloqué sur la partie connexion. Laissez-moi vous montrer le code.

Voici la fonction qui vérifie ma collection mongoDB si un utilisateur particulier existe. S'il existe, il définit userExists sur True. C'est une variable globale. Je suppose que ce n'est pas bon, mais je ne pouvais pas le faire en plaçant cette variable dans la fonction. Je tiens également à souligner que cette fonction de recherche fonctionne bien et qu'elle renvoie vraiment vrai ou faux selon que l'utilisateur existe ou non.

async function checkUser(userData) {
    await dbConnect();
    await _db.db('blackmarket').collection('users').find().toArray(async (err, content) => {

        const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)

        if (foundUser) {
            usersExists = await true
            console.log(userExists); // if exists it will display true in console, but later than the same value from *app.post('/login')*

        } else if (!foundUser) {
            usersExists = await false;
            console.log(userExists);
        }
    })
}

Voici le code express.js. Lorsque j'essaie d'afficher userExists dans app.post('/login'), il affiche null, ce n'est qu'après une deuxième tentative de connexion qu'il renvoie true, car tout code contenu dans app.post(' /login') est exécuté plus rapidement que la fonction checkUser(). Je dois avoir un accès instantané à cette variable globale userExists depuis app.post('/login') car j'en aurai besoin dans ma réponse de récupération plus tard. Je suppose que le problème vient de la nature asynchrone de ce qui se passe là-bas. Pour être honnête, je ne sais pas si ma compréhension de async/await est assez bonne. Je vais l'étudier beaucoup plus en profondeur plus tard, mais pour l'instant, je veux comprendre pourquoi cela fonctionne comme ça.

const app = express();
app.use(express.json())
app.use(express.urlencoded({
    extended: true
}))
app.use(express.static('static'))

app.post('/register', (req, res) => {
    registerUser(req.body).catch(console.error);
    res.end();
})

app.post('/login', (req, res) => {
    checkUser(req.body).catch(console.error)
    //here I want to attach userExists value to response(later)
    console.log(userExists) - here it displays null
    res.end();
})

app.listen(process.env.PORT || 5000, () => {
    console.log('running...');
})
1
Bartek Ostrowski 18 nov. 2020 à 19:24

1 réponse

Meilleure réponse

Cela se produit parce que votre fonction 'checkUser' est une fonction asynchrone, donc l'exécution du programme avance après l'avoir appelée et vous vous retrouvez avec une valeur nulle de userExist. Vous pouvez le réparer de cette manière :

   async function checkUser(userData) {
    await dbConnect();
    var content=await _db.db('blackmarket').collection('users').find().toArray();

    const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)

    if (foundUser) {
      
        console.log(foundUser); 
        return true;
    } else if (!foundUser) {
        console.log(foundUser);
        return false;
    }

}

De plus, vous n'avez pas besoin d'une variable globale pour y parvenir. Modifiez votre fonction d'appel comme ceci :

      app.post('/login',async (req, res) => {
        try{
          var userExist=await checkUser(req.body);
          //here I want to attach userExists value to response(later)
          console.log(userExists)
          res.end();
        }
         catch(error){
            console.log(error)
         }

      })

Une autre suggestion - Chiffrez le mot de passe de l'utilisateur avant de le stocker dans la base de données au lieu de le stocker directement.

1
Naveen Chahar 18 nov. 2020 à 17:04