Maison >base de données >tutoriel mysql >Pourquoi ma promesse dans Node.js Express n'attend-elle pas la fin de la requête de base de données ?

Pourquoi ma promesse dans Node.js Express n'attend-elle pas la fin de la requête de base de données ?

DDD
DDDoriginal
2024-11-19 02:22:02940parcourir

Why Is My Promise in Node.js Express Not Waiting for the Database Query to Complete?

Les promesses ne se comportent pas comme prévu dans Node.js Express

Comprendre le problème

Dans le code fourni, la promesse ne suspend pas l'exécution de le code pour attendre la fin de la fonction findUser. En effet, la fonction findUser ne renvoie pas de promesse. Au lieu de cela, il renvoie immédiatement undefined, ce qui entraîne la poursuite du code sans attendre la fin de la requête de base de données.

Correction du code

Pour résoudre ce problème, la fonction findUser doit renvoyer une promesse qui se résout avec les lignes récupérées de la base de données :

me.findUser = function(params, res) {
    var username = params.username;

    return new Promise(function (res, rej) {
        pool.getConnection(function (err, connection) {
            if (err) {
                rej('db error');
            } else {
                connection.query('SELECT Id, Name, Password FROM Users WHERE Users.Name = ?', [username], function (err, rows) {
                    connection.release();
                    if (!err) {
                        res(rows);
                    } else {
                        rej('other error');
                    }
                });
            }
        });
    });
}

Avec ce changement, la promesse mettra en pause l'exécution du code et attendra la fin de la requête avant de procéder à la if/else.

Explication du gestionnaire d'erreurs

Le gestionnaire d'erreurs du gestionnaire d'erreurs est généré car la fonction findUser rejette la promesse avec un message d'erreur. Cela entraîne l'omission du gestionnaire then et l'appel du gestionnaire catch (avec le message « gestionnaire d'erreurs seconde »).

Pour résoudre ce problème, assurez-vous que la fonction findUser gère les erreurs et les résout avec le résultat souhaité. données correctement. De plus, vous pouvez ajouter la gestion des erreurs au niveau suivant de la chaîne de promesses pour gérer les erreurs ultérieures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn