Что ж, если это 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();
}
}
});