Maison  >  Article  >  base de données  >  Pourquoi mon API de connexion Node.js ne fonctionne-t-elle pas avec les promesses ?

Pourquoi mon API de connexion Node.js ne fonctionne-t-elle pas avec les promesses ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-16 06:38:02633parcourir

Why Is My Node.js Login API Not Working with Promises?

Node.js Express et les promesses ne se comportent pas comme prévu

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 :

1. Promesse de ne pas attendre la requête de base de données

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);
          }
        });
      }
    });
  });
}

2. Le gestionnaire d'erreurs ne se déclenche pas

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);
      }
    });
  });
}

Revised Routes File

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);
    }
  });
}

Explication

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!

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