Soy nuevo en JavaScript y parece que no puedo hacer que esto funcione, el tema de la prueba depende de la entrada del usuario... cuando el usuario presiona siguiente, obtengo el tema (esto también lleva al usuario a la página principal de la prueba), luego tengo que obtener datos de la API con el tema como parámetro... Tengo que procesar el resultado de la operación de obtención... Luego tengo que pasar esa información a la página principal del cuestionario... pero la variable que se supone para ser completado por la solicitud de recuperación aún no está definido cuando paso a la página principal del cuestionario
var Allquestions; var sheetdb = require('sheetdb-node'); // create a config file var config = { address: 'https://sheetdb.io/api/v1/9djmf8ydc7hwy', }; //sheetdb // Create new client var client = sheetdb(config); function downloadquestions(topic) { console.log(topic); client.read({ limit: 2, sheet: topic }).then(function(data) { console.log(data + " in client.read func") processQuestions(data); }, function(err){ console.log(err); }); } async function processQuestions(data) { console.log(data + "data in process"); Allquestions = JSON.parse(data); console.log(Allquestions[0].Question + " This is defined"); } app.get("/", (req, res) => { res.render("pages/index", { title: "Home"}); }); // app.post("/" , urlencodedParser ,(req , res) => { // console.log(req.body.topic); // }) app.get("/questions", urlencodedParser , (req , res) => { downloadquestions(req.body.topic); console.log(Allquestions + " this is undefined"); res.render("/pages/quizpage" , {Allquestions}) })Hay algunos problemas con su código, tiene una cadena de promesa rota, client.read( es una promesa, y esa promesa no va a ninguna parte. O la devuelve o la await . Para poder await su necesitará también marque su ruta (req, res) como async también.
Su código está un poco mezclado, tiene Allquestions como una variable global, esto no es bueno para múltiples usuarios, ya que el último tema lo anulará cada vez.
También trate de evitar tragar excepciones en las funciones de utilidad, trate de mantener su manejo de excepciones en el nivel superior, por ejemplo. en su caso dentro de su controlador de req/res.
Entonces, con todo esto en mente, su código refactorizado podría verse como ->
const sheetdb = require('sheetdb-node'); // create a config file const config = { address: 'https://sheetdb.io/api/v1/9djmf8ydc7hwy', }; //sheetdb // Create new client const client = sheetdb(config); async function downloadquestions(topic) { const data = await client.read({ limit: 2, sheet: topic }); return processQuestions(data); } function processQuestions(data) { return JSON.parse(data); } app.get("/", (req, res) => { res.render("pages/index", { title: "Home"}); }); app.get("/questions", urlencodedParser , async (req , res) => { try { const allQuestions = await downloadquestions(req.body.topic); res.render("/pages/quizpage" , {Allquestions}); } catch (e) { console.error(e); res.end('There was an error'); } })