Express.js en utilisant un passeport avec await

element11:

Je suis en train d'ajouter à mySQL passport.js pour authentifier les utilisateurs dans express.js, mais ne peut pas sembler obtenir de travail vous attendent. Server.js:

initializePassport(
  passport,
  function(email) {
    pool.getConnection(function(err, connection) {
      if (err) throw err;
      console.log("Connected!");
      pool.query("SELECT * FROM users WHERE email = ?", email, function (err, result) {
        if (err) throw err;
        return result[0];

        connection.release();
      });
    });
  },
)

La configuration de passeport

function initialize(passport, getUserByEmail) {
  const authenticateUser = async (email, password, done) => {
    try {
      const user = await getUserByEmail(email);
      console.log(user)
    } catch (e) {
      return done(e)
    }

En ce moment, il imprime juste undefined pour l'utilisateur, puis imprime Connected. Je ne sais pas pourquoi l'utilisateur await ne fonctionne pas.

jfriend00:

Eh bien , si c'est getUserByEmail(), il ne retourne pas une promesse qui est connecté au moment où il est des opérations asynchrones sont faites, par conséquent, faire await getUserByEmail()ne pas attendre quoi que ce soit.

awaitSeulement quelque chose d' utile si vous êtes en attente d' une promesse qui est connecté à l'opération que vous voulez attendre pour. Puisque vous n'êtes pas encore en attente d' une promesse, qui awaitne fait rien utile. Vous auriez besoin de changer getUserByEmail()afin qu'il retourne une promesse qui est connecté à l'opération asynchrone que vous essayez d'attendre.

Pour une fonction pour retourner une promesse qui est relié aux opérations asynchrones, vous devez utiliser des opérations asynchrones à base promesse, non des opérations asynchrones de rappel clair, partout dans cette fonction. Ce sont toutes les opérations de base de données et toutes les bases de données modernes disposent d' une interface promesse maintenant si ce que vous voulez vraiment faire est de passer .getConnection(), .query()et .release()à toutes les opérations à base de promesse d'utilisation. Cela permettra aussi beaucoup plus simple à mettre en œuvre la gestion des erreurs et une communication appropriée à l'appelant d'erreurs.

Je ne sais pas moi - même mysql particulièrement bien, mais voici une idée générale. L'interface de promesse vient du module mysql2/promise:

const mysql = require('mysql2/promise');
const pool = mysql.createPool({...});

initializePassport(passport, async function(email) {
    let connection;
    try {
        connection = await pool.getConnection();
        console.log("Connected!");
        let result = await pool.query("SELECT * FROM users WHERE email = ?", email);
        return result[0];
    } catch(e) {
        // log the error and the rethrow so the caller gets it
        console.log(e);
        throw e;
    } finally {
        if (connection) {
            connection.release();
        }
    }
});

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=282345&siteId=1
conseillé
Classement