0
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])))?

n33t
  • 33
  • 5

1 Answers1

1

Использовать асинхронные функции. Можно конечно и на 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 } // ... Что то делаем дальше })()

  • Спасибо за ответ, сейчас достаточно того, что вы сообщили о невозможности возвращения return такого значения. Здесь s(result) обозначает, что в s передаётся результат, правильно? – n33t Sep 26 '21 at 00:01
  • Попробовал, всё получилось, огромное спасибо за ответ :)))) Но не могли бы вы ответить на последний вопрос, или подсказать что загуглить, почему при нашем return s(result), return возвращается не в функцию function(err, result, field), а в Promise? – n33t Sep 26 '21 at 00:29
  • Хотя, видимо я не правильно понял, у нас просто указывается значение для s в виде result, а не происходит return – n33t Sep 26 '21 at 00:33
  • 1
    @n33t return-ом мы уже возвратили Promise - обертка для выполнения отложенных операций. Оператор await приостанавливает async-функцию и дожидается разрешения Promise. При вызове resolve(у нас это s(...)) Promise считается разрешенным. Ранее установленный оператор await извлекает результат из Promise и передает его переменной. – Alexander Lonberg Sep 26 '21 at 12:31