Heim >Datenbank >MySQL-Tutorial >Warum funktioniert meine Node.js-Anmelde-API nicht mit Versprechen?

Warum funktioniert meine Node.js-Anmelde-API nicht mit Versprechen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-16 06:38:02702Durchsuche

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

Node.js Express und Promises verhalten sich nicht wie erwartet

Ihre Node.js-Anmelde-API zeigt aufgrund eines Missverständnisses unerwartetes Verhalten wie Versprechen mit asynchronen Vorgängen interagieren. Lassen Sie uns jedes Problem angehen:

1. Versprechen wartet nicht auf Datenbankabfrage

Ihre Funktion findUser() gibt kein Versprechen zurück. Stattdessen wird undefiniert sofort zurückgegeben, da die Datenbankabfrage asynchron ist und Zeit für die Ausführung benötigt. Um dies zu beheben, müssen Sie eine Rückruffunktion an die query()-Methode übergeben, die aufgerufen wird, wenn die Abfrage abgeschlossen ist:

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. Fehlerhandler wird nicht ausgelöst

Ihr Fehlerhandler wird nicht ausgelöst, da die Methode „reject()“ des Versprechens nie aufgerufen wird. In Ihrem Code geben Sie vom Rückruf für die Datenbankabfrage „false“ zurück, wenn ein Fehler auftritt. Stattdessen sollten Sie das Versprechen mit folgendem Fehler ablehnen():

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

Hier ist eine korrigierte Version Ihrer Login-Routendatei verwendet Versprechen richtig:

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

Explanation

Durch die Verwendung von Versprechen stellen Sie sicher, dass jeder Schritt in Ihrer Anmelde-API nacheinander ausgeführt wird. Das Schlüsselwort „await“ lässt den Code auf die Auflösung des Versprechens warten, bevor er fortfährt, und stellt so sicher, dass der nächste Schritt Zugriff auf die Daten des vorherigen Schritts hat. Darüber hinaus können Sie durch die Verwendung von try/catch alle Fehler behandeln, die während des Prozesses auftreten können.

Das obige ist der detaillierte Inhalt vonWarum funktioniert meine Node.js-Anmelde-API nicht mit Versprechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn