Электрон / NodeJS: я не могу извлечь mysql данные таблицы и распечатать их в индексе. html страница - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в разработке Electron и NodeJS. В моем настольном приложении я определил как таковые классы DAO для извлечения моих данных из моей схемы БД. Каждый класс имеет все обычные функции CRUD (соответствующие всем запросам, которые им нужны). Т.е. для моей функции getAllProducts() я определил ее следующим образом

    class ProdottiDAO {
    ...
 getAllProducts(callback)
  { 
    var query = "SELECT * FROM `MY_TABLE`";
     this.resultQuery = this.sqlManager.CONNECTION.query(query, null,  function(error, results, fields){
      if (error) throw error;
      return callback(results);
    });
  • sqlManager является закрытым членом, просто создает соединение с БД
  • resultQuery является закрытый член просто должен хранить таблицы данных

В моем index.js я пытаюсь получить свои данные следующим образом:

var resultQuery = [];
var prodotto = new ProdottiDAO();
prodotto.getAllProducts(function (res){
     if(res.length==0) alert("No products");
    for(var i=0; i<res.length; i++){
      // Stores res in resultQuery var
      resultQuery.push(res[i]);
    }
});
document.getElementById('desc-prod').innerText = resultQuery[0][0].descrizione;

Но переменная resultQuery[0][0] всегда устанавливается как undefined на index. html на странице, в то время как при печати с помощью console.log (resultQuery) я могу правильно получить доступ к структуре RowDataPacket с помощью resultQuery[0][0]. Что я могу сделать, чтобы извлечь данные res из функции обратного вызова?

1 Ответ

1 голос
/ 26 февраля 2020

Я вижу две очевидные проблемы:

  1. Доступ к базе данных обычно асинхронный. Если это верно для вашего приложения, то вам, вероятно, придется «дождаться» результата. Тогда можно ожидать, что массив resultQuery будет пустым, когда вы на самом деле получите к нему доступ

  2. Такие реализации DAO обычно выполняются в основном процессе, части node.js вашего приложения. Здесь вы создаете DAO на клиенте (процесс рендеринга), и мне интересно, действительно ли DAO может получить доступ к базе данных. Вероятно, нет, может быть, это приводит к ошибке из-за этого, и поэтому вы ничего не видите.

Я бы оставил ProdottiDAO в основном процессе и определил бы простой ipcChannel так, чтобы клиент и сервер могут общаться. Клиент отправляет сообщение через ipc.sendSync('find-all-products'), и основной процесс прослушивает его, выполняет запрос и возвращает данные с помощью event.result = resultQuery.

(может быть решено асинхронно, но это более простой способ заставить его работать и улучшить позже)

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