Maison > Article > base de données > Pourquoi mon API de connexion Node.js ne fonctionne-t-elle pas avec les promesses ?
Votre API de connexion Node.js présente un comportement inattendu en raison d'un malentendu de la manière dont les promesses interagissent avec les opérations asynchrones. Abordons chaque problème :
Votre fonction findUser() ne renvoie pas de promesse. Au lieu de cela, il renvoie immédiatement undefined car la requête de base de données est asynchrone et prend du temps à s’exécuter. Pour résoudre ce problème, vous devez transmettre une fonction de rappel à la méthode query(), qui sera invoquée une fois la requête terminée :
me.findUser = function(params, res) { var username = params.username; return new Promise(function (resolve, reject) { pool.getConnection(function (err, connection) { if (err) { reject(err); } else { connection.query('select ...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); } }); }); }
Votre gestionnaire d'erreurs n'est pas déclenché car la méthode rejet() de la promesse n'est jamais appelée. Dans votre code, vous renvoyez false à partir du rappel de la requête de base de données lorsqu'une erreur se produit. Au lieu de cela, vous devez rejeter() la promesse avec l'erreur :
me.findUser = function(params, res) { // ... return new Promise(function (resolve, reject) { // ... connection.query('...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); }); }
Voici une version corrigée de votre fichier de route de connexion qui utilise correctement les promesses :
module.exports = function(app) { app.post('/login/', async function(req, res, next) { try { // Find user in database var rows = await loginM.findUser(req.body, res); // Do something with the data var result = await loginC.doSomething(rows); console.log("Success"); } catch (err) { console.log("Failed: " + err.message); } }); }
En utilisant des promesses, vous vous assurez que chaque étape de votre API de connexion s'exécute dans l'ordre. Le mot-clé wait fait attendre le code que la promesse soit résolue avant de continuer, garantissant ainsi que l'étape suivante a accès aux données de l'étape précédente. De plus, l'utilisation de try/catch vous permet de gérer les erreurs pouvant survenir au cours du processus.
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!