Tengo una solicitud de base de datos sqlite3 en mi main.js , que se activa al hacer clic en un botón en renderer.js .
La solicitud llega a mi main.js Sin embargo, no puedo esperar los resultados de la base de datos. El problema ya ocurre en main.js , por lo que estoy atascado incluso antes de que algo se devuelva a renderer.js .
Espero que alguien pueda decirme lo que me estoy perdiendo.
Aquí está mi código:
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 }Y así es como se ve mi terminal:
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' }Debe convertir el resultado de db_request en una Promesa, y la promesa se resolverá cuando todas las filas se envíen a los data . Cuando usa la palabra clave await , no hay necesidad de manejar una promesa con la cadena .then .
main.js se verá así:
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) } }); }) }