Estoy tratando de crear una página web simple para mostrar el contenido de una tabla almacenada en una tabla sqlite3. Estoy usando vanilla js para el frontend (¡NO JQUERY!) y node.js + sqlite3 para el backend. Puedo consultar la base de datos muy bien dentro de mi secuencia de comandos de nodo, pero no puedo averiguar cómo devolver los resultados a mi secuencia de comandos frontend js. El problema parece ser que, dado que las consultas son asíncronas, la función ( get_rows() ) regresa antes de que se completen las consultas. Código a continuación.
main.js (script de interfaz utilizado por la página web)
xmlhttp.open("POST", "http://localhost:3000/load", true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { console.log(xmlhttp.responseText); let rows = JSON.parse(xmlhttp.responseText); console.log(rows); //now we can parse rows and create table console.log("rows: " + rows); } } xmlhttp.setRequestHeader("Content-Type", "text/plain", "Access-Control-Allow-Origin", "*"); xmlhttp.send(tbl_name);access.js (script node.js que maneja la consulta sqlite3)
const http = require('http'); const url = require('url'); const sqlite = require('sqlite3').verbose(); get_rows = function(table) { let test = null; //open database let db = new sqlite.Database("../../databases/test_db.db", err=> { if (err) { console.error(err.message); } console.log("Opened database from disk"); }); //get rows db.all('SELECT * FROM ' + table, (err, row) => { if (err) { console.error(err.essage); } test = row; }); //close database db.close((err) => { if (err) { console.error(err.message); } console.log("Closed database"); }); return test; } http.createServer(function (req, res) { let path = url.parse(req.url).pathname; res.writeHead(200, {"Content-type": "text/plain", 'Access-Control-Allow-Origin' : '*'}); if (path === "/load") { req.on("data", function(tbl_name) { console.log("Loaded table: " + tbl_name); res.end(get_rows(tbl_name)); }); } }).listen(3000);