Функция не возвращает массив элементов, созданных из MySQL Query (async / Await) - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать массив элементов из запроса MySQL для возврата из асинхронной функции, но возвращаемые значения пусты.

Вещи, которые я пробовал:

  • Читайте до последней информации об async / await
  • Переполнение стека
  • Многочисленные тесты по изменению кода, замене обратных вызовов, переписыванию функций.

Это для нового веб-сервиса (nodejs), который должен инициализировать значения из базы данных MySQL и после этого быстрый доступ к значениям для сравнения их со значениями, полученными из Интернета. Чтобы ограничить количество обращений к базе данных, я планирую хранить значения в массиве (в памяти) и всякий раз, когда они меняются достаточно (на основе вычислений), записывать их в БД.

Все основано на Linux с использованием узла 11

require('dotenv').config()

var mysql = require('mysql')
var dbconnection = mysql.createConnection({
  host: 'localhost',
  user: process.env.MYSQL_USER,
  password: process.env.MYSQL_PW,
  database: process.env.MYSQL_DB
})
dbconnection.connect(function (err) {
  if (err) {
    console.error('error connecting: ' + err.stack)
  }
})
async function ReadDB () {
  var ArrBuyPrice = []
  var query = 'SELECT * FROM pricing'
  var items = await dbconnection.query(query, function (err, rows, result) {
    if (err) throw err
    for (var i in rows) {
      ArrBuyPrice.push(rows[i].price_buy.toFixed(8))
    }
    return ArrBuyPrice
  })
  return items
}

async function InitialProcess () {
  var DbResult = await ReadDB()
  console.log(DbResult)
}

InitialProcess()

Я ожидаю, что console.log будет [ '0.00000925', '0.00000012' ]

1 Ответ

0 голосов
/ 03 мая 2019
// https://stackoverflow.com/questions/44004418

var mysql = require('mysql')
var dbconnection = mysql.createConnection({
    host: 'localhost',
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_PW,
    database: process.env.MYSQL_DB
})

const util = require('util');

async function ReadDB() {
    var ArrBuyPrice = []

    const query = util.promisify(dbconnection.query).bind(dbconnection);

    try {
        const rows = await query('select * from pricing');
        for (var i in rows) {
            ArrBuyPrice.push(rows[i].price_buy.toFixed(8))
        }
        return ArrBuyPrice;
    } catch (error) {
        console.log(error)
        return [];
    } finally {
        dbconnection.end();
    }
}

async function InitialProcess() {
    var DbResult = await ReadDB()
    console.log(DbResult)
}

InitialProcess();

В чем проблема:

async function ReadDB() {
  var ArrBuyPrice = []
  var query = 'SELECT * FROM pricing';

  var items = await dbconnection.query(query, function (err, rows, result) {
    if (err) throw err
    for (var i in rows) {
      ArrBuyPrice.push(rows[i].price_buy.toFixed(8))
    }
    return ArrBuyPrice
  });
  return items
}

При await dbconnection.query, await не работает и не требуется, поскольку функция dbconnection.query()не является функцией Promise.

Итак, rows результат запроса будет получен после return items;И функция return ArrBuyPrice не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...