Maison > base de données > tutoriel mysql > 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
Libérer: 2024-11-16 06:38:02
original
753 Les gens l'ont consulté

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);
          }
        });
      }
    });
  });
}
Copier après la connexion

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);
      }
    });
  });
}
Copier après la connexion

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);
    }
  });
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal