Node.js 电子/节点:我能';t检索mysql表数据并在index.html页面上打印它们

Node.js 电子/节点:我能';t检索mysql表数据并在index.html页面上打印它们,node.js,electron,Node.js,Electron,我是电子和NodeJS开发方面的新手。在我的桌面应用程序中,我定义了诸如DAO类之类的类来从db模式检索数据。每个类都有所有常用的CRUD函数(对应于它们需要的所有查询)。例如,对于我的函数getAllProducts(),我将其定义如下 class ProdottiDAO { ... getAllProducts(callback) { var query = "SELECT * FROM `MY_TABLE`"; this.resultQuery =

我是电子和NodeJS开发方面的新手。在我的桌面应用程序中,我定义了诸如DAO类之类的类来从db模式检索数据。每个类都有所有常用的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;
var resultQuery=[];
var prodotto=新的prodotto();
prodotto.getAllProducts(函数(res)){
如果(res.length==0)警报(“无产品”);

对于(var i=0;i我发现两个明显的问题:

  • 数据库访问通常是异步的。如果应用程序也是这样,那么您可能必须“等待”结果。那么当您实际访问时,
    resultQuery
    数组应该是空的

  • 这样的DAO实现通常在主进程上运行,即应用程序的node.js部分。在这里,您在客户端(渲染进程)上创建DAO,我想知道DAO是否真的能够访问数据库。可能不会,可能因此而失败并出现错误,这就是为什么您什么也看不到的原因

  • 我将在主进程上保留
    ProdottiDAO
    ,并定义一个简单的IPCConnel,以便客户端和后端可以通信。客户端将通过
    ipc.sendSync('find-all-products')发送消息
    主进程将监听该消息,执行查询并返回带有
    event.result=resultQuery
    的数据


    (可以异步解决,但这是让它工作起来并在以后改进的更简单的方法)

    Hi Andreas。谢谢你的回答。回调函数不应该是我调用的“等待函数”吗?如果我更改
    resultQuery.push(res[I]);
    with
    printToHTMLpage(table,res[I])
    我可以看到我所有的数据。因此结果是可用的,但仅在回调正文中。这是否正确?我不知道如何使用ipcChannel,但我会看到文档。是的,看起来您在sqlmanager上的查询函数正在阻塞(同步)。这很令人惊讶,但很好。更可能的情况是,您必须仔细检查渲染进程(客户端)上可以使用什么,以及主进程(node.js)上必须执行什么。而且这两个进程只能通过IPC交换数据,它们彼此完全隔离。