JS, как изменить глобальную переменную в данной ситуации

function (email) {
var ourUser
// Подключение к дб
const connection = mysql.createConnection({
  user: "root",
  database: "users",
  port: "3309",
  password: "root"
})
// Запрос в бд
connection.query(`SELECT * FROM users WHERE login= ?`, email, function (err, result, field) {
  // Структура успешно создаётся, данные заносятся
  ourUser = JSON.parse(JSON.stringify(result[0]))
  // Закрываем подключение
  connection.end()
})
// В итоге получаем undefind
return ourUser
}

Хочу перенести данные (логин, пароль, id) из бд в переменную, а позже вернуть её по результату вычисления функции. Как можно это реализовать(нужно по итогам вычисления функции, вернуть эту структуру наружу фукнции ourUser = JSON.parse(JSON.stringify(result[0])))?


Ответы (1 шт):

Автор решения: Alexander Lonberg

Использовать асинхронные функции. Можно конечно и на callback-ах, но с ними легче запутаться. return-ом такое возвратить нельзя.

async function select(email) {
  // ...
  return new Promise((s, e) => {
    connection.query(`SELECT * FROM users WHERE login= ?`, email, function (err, result, field) {
      connection.end()
      // Эта строка эквивалентна return или throw Error
      err ? e(err) : s(result) 
    })
  })
}

void (async () => {
  let result
  try {
    result = await select(email)
  } catch (e) {
    console.error(e)
    return
  }
  // ... Что то делаем дальше
})()
→ Ссылка