Soy nuevo en Node.js, así que tenga paciencia conmigo. Estoy experimentando dificultades con un servidor Express.
Mi objetivo es hacer una solicitud GET y cargar los datos de un servidor externo y presentarlos en mi sitio web. Cargué con éxito los datos del servidor externo y los analicé en el objeto JS. Cuando hago console.log , puedo ver que el objeto JS se transforma correctamente. Pero cuando lo represento en mi archivo ejs, dice que la matriz que pasé no está definida. Escribí correctamente los nombres de las variables. Cuando lo inspecciono usando herramientas de desarrollador y aparece este mensaje de error en la consola:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Este es el código que tengo:
const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.set('view engine', 'ejs'); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static(__dirname + "/public")); // const ejs = require("ejs"); const https = require('https'); app.get("/Health",function(req, res) { let healthUrl = "https://newsapi.org/v2/top-headlines/?category=health&apiKey=API_KEY&language=en"; https.get(healthUrl, (resp) => { let data =''; resp.on("data",(chunk)=>{ data += chunk; }); resp.on("end",() => { let newData = JSON.parse(data); let allArticles = newData.articles; }); }).on('error', (e) => { console.error(e); }); res.render("Health",{allArticles:allArticles}); }); cuando console.log(allArticles) en el archivo app.js , puedo ver el javascript que cargué. Pero cuando lo rendericé en el archivo ejs, ocurrió un error y recibí el mensaje de que "allArticles is undefined" . Lo verifiqué en el archivo ejs como se muestra a continuación:
<%-include('partials/header')-%> <% console.log(allArticles) %> <%-include('partials/footer')-%>está intentando acceder a la variable allArticles fuera de su alcance Intente devolver res.render donde ha declarado la variable allArticles La solución estará a continuación:
app.get("/Health", function (req, res) { let healthUrl = "https://newsapi.org/v2/top-headlines/category=health&apiKey=5ad38a0db6944d22aa81b5420f6a62f4&language=en"; https .get(healthUrl, (resp) => { let data = ""; resp.on("data", (chunk) => { data += chunk; }); resp.on("end", () => { let newData = JSON.parse(data); let allArticles = newData.articles; // returning response where allArticles declared return res.render("Health", { allArticles: allArticles }); }); }) .on("error", (e) => { console.error(e); }); });Las variables en javascript tienen alcance. Lo declaras con let dentro de este bloque:
resp.on("end",() => { let newData = JSON.parse(data); let allArticles = newData.articles; });y por lo tanto no se puede utilizar fuera de ese bloque. Para solucionarlo, intente declarar la variable afuera y asignarla adentro. Como esto:
let allArticles; resp.on("end",() => { let newData = JSON.parse(data); allArticles = newData.articles; });Sin embargo, probablemente solo desee renderizar la página si no se produjo ningún error, así que intente mover la línea de renderizado dentro de este bloque, así:
resp.on("end",() => { let newData = JSON.parse(data); let allArticles = newData.articles; res.render("Health",{allArticles:allArticles}); });