Express. js используя await с паспортом - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь добавить mySQL к паспорту. js для аутентификации пользователей в express. js, но, похоже, не могу дождаться начала работы. Сервер. 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();
      });
    });
  },
)

Конфигурация паспорта

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

Прямо сейчас он просто печатает неопределенное для пользователя, а затем печатает Подключено. Я не уверен, почему ожидающий пользователь не работает.

1 Ответ

0 голосов
/ 14 марта 2020

Что ж, если это getUserByEmail(), то он не возвращает обещание, с которым он связан, когда выполняются асинхронные операции, поэтому выполнение await getUserByEmail() ничего не ждет.

await ТОЛЬКО делает что-то полезное, если вы ожидаете обещания, связанного с операцией, которую вы хотите ожидать. Поскольку вы даже не ожидаете обещания, то await ничего не даст. Вам нужно изменить getUserByEmail(), чтобы он возвращал обещание, связанное с асинхронной операцией, которую вы пытаетесь дождаться.

Чтобы функция возвращала обещание, связанное с асинхронными операциями, Вы должны использовать асинхронные операции на основе обещаний, а не простые асинхронные операции обратного вызова, везде в этой функции. Все это операции с базами данных, и все современные базы данных теперь имеют интерфейс, основанный на обещаниях, поэтому вам действительно нужно переключить .getConnection(), .query() и .release() на все операции, основанные на обещаниях. Это также значительно упростит реализацию правильной обработки ошибок и правильного обмена информацией с вызывающим лицом.

Я сам не очень хорошо знаю mysql, но вот общая идея. Интерфейс обещания происходит от модуля 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();
        }
    }
});
...