Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

102
Vistas
Electron await sqlite3 response

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' }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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)
      }
    });
  })
}
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda