电子等待sqlite3响应

发布于 2025-02-02 11:35:47 字数 1898 浏览 2 评论 0原文

我在我的main.js中有一个sqlite3数据库请求,该请求是通过按钮单击renderer.js触发的。

该请求到达我的main.js。但是,我无法等待数据库的结果。该问题已经发生在main.js中,因此我甚至在传递给Renderer.js之前就卡住了

我希望有人能告诉我我缺少什么。

这是我的代码:

Renderer.js

$(document).on('click','#mybtn',function(e){

    let query = "SELECT id, name FROM table1"

    // send (here is the issue)
    window.api.send("db-query", query)

    // (next step: receive, might be wrong but not yet my problem)
    window.api.receive(channel="receive-db-data", (data) => {
      console.log(data);
    });

});

main.js


ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query);
  
  let data = await db_request(query).then(
      function(value) {
         console.log('value: ' + value);
         return value;
      },
      function(error) {
         console.log('error fetching data from db on query:' + query);
      }
  )
  console.log("response ready: " + data); //returns undefined if 'return value' is used (otherwise nothing)

  // to send back to renderer.js later
  e.sender.send("db-data", data)

})


let db_request = async (query) => {

  let data = []

  var sqlite3 = require('sqlite3').verbose();
  var dbPath = require('path').resolve(__dirname, '../../Fin.db')
  var db = new sqlite3.Database(dbPath)

  db.serialize(function(){
    db.each(query, function(err, row) {
      console.log(row)
      data.push({"id": row.id, "name": row.name})
    });
  });
  db.close();

  console.log('db_request:' + data)

  return data
}

,这就是我的终端的样子:

query received: SELECT id, type, name FROM table1
db_request:
value: 
response ready: undefined
{ id: 1, name: 'a' }
{ id: 2, name: 'b' }
{ id: 3, name: 'c' }

I have a sqlite3 database request in my main.js, that is triggered by button click in renderer.js.

The request reaches my main.js. However, I cannot manage to await the results from the database. The issue occurs already in main.js, so I'm stuck even before anything is passed back to the renderer.js.

I hope someone can tell me what I am missing.

Here is my code:

renderer.js

$(document).on('click','#mybtn',function(e){

    let query = "SELECT id, name FROM table1"

    // send (here is the issue)
    window.api.send("db-query", query)

    // (next step: receive, might be wrong but not yet my problem)
    window.api.receive(channel="receive-db-data", (data) => {
      console.log(data);
    });

});

main.js


ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query);
  
  let data = await db_request(query).then(
      function(value) {
         console.log('value: ' + value);
         return value;
      },
      function(error) {
         console.log('error fetching data from db on query:' + query);
      }
  )
  console.log("response ready: " + data); //returns undefined if 'return value' is used (otherwise nothing)

  // to send back to renderer.js later
  e.sender.send("db-data", data)

})


let db_request = async (query) => {

  let data = []

  var sqlite3 = require('sqlite3').verbose();
  var dbPath = require('path').resolve(__dirname, '../../Fin.db')
  var db = new sqlite3.Database(dbPath)

  db.serialize(function(){
    db.each(query, function(err, row) {
      console.log(row)
      data.push({"id": row.id, "name": row.name})
    });
  });
  db.close();

  console.log('db_request:' + data)

  return data
}

And this is how my terminal looks like:

query received: SELECT id, type, name FROM table1
db_request:
value: 
response ready: undefined
{ id: 1, name: 'a' }
{ id: 2, name: 'b' }
{ id: 3, name: 'c' }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

双手揣兜 2025-02-09 11:35:47

您必须将db_request结果转换为承诺,当将所有行推到data时,将解决承诺。当您使用等待关键字时,无需使用。然后链条处理承诺。

main.js看起来像这样:

const sqlite3 = require('sqlite3').verbose();
const dbPath = require('path').resolve(__dirname, '../../Fin.db')

ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query)

  try {
    const data = await db_request(query); // remove .then
    console.log('value: ' + data)
    // to send back to renderer.js later
    e.sender.send("db-data", data)
  } catch (error) {
    console.log('error fetching data from db on query:' + query);
    e.sender.send("db-data", []) // send empty data or error ???
  }
})


let db_request = (query) => {
  const db = new sqlite3.Database(dbPath)

  return new Promise((resolve, reject) => { // return a promise
    // I think you dont need serialize for this case
    const data = []
    db.each(query, (err, row) => {
      console.log(err, row)
      if (!err) {
        data.push({"id": row.id, "name": row.name})
      }
    }, (error) => {
      if (error) {
        reject(error)
      } else {
        resolve(data)
      }
    });
  })
}

You have to convert db_request result to a Promise, and the promise will be resolved when all rows are pushed to the data. When you use the await keyword, there is no need to handle a promise with .then chain.

main.js will look like this:

const sqlite3 = require('sqlite3').verbose();
const dbPath = require('path').resolve(__dirname, '../../Fin.db')

ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query)

  try {
    const data = await db_request(query); // remove .then
    console.log('value: ' + data)
    // to send back to renderer.js later
    e.sender.send("db-data", data)
  } catch (error) {
    console.log('error fetching data from db on query:' + query);
    e.sender.send("db-data", []) // send empty data or error ???
  }
})


let db_request = (query) => {
  const db = new sqlite3.Database(dbPath)

  return new Promise((resolve, reject) => { // return a promise
    // I think you dont need serialize for this case
    const data = []
    db.each(query, (err, row) => {
      console.log(err, row)
      if (!err) {
        data.push({"id": row.id, "name": row.name})
      }
    }, (error) => {
      if (error) {
        reject(error)
      } else {
        resolve(data)
      }
    });
  })
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文