Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

287
Visualizações
¿Cómo lidiar con los servicios API de tasa limitada usando React/Node.js? (Error de referencia)

Hola, soy nuevo en React y NodeJS y actualmente estoy tratando de abrirme camino extrayendo de un servicio API de tasa limitada. Mi idea es hacer que NodeJS extraiga datos del servicio API cada 30 minutos más o menos y los envíe a mi punto final express "/youtube" para que mi interfaz pueda extraerlos infinitamente. Sin embargo, no sé si esta es la mejor práctica y también me encuentro con un ReferenceError con mi código. Cualquier ayuda sería muy apreciada.

Puedo consola.log (datos), así que sé que la variable está definida, pero no estoy seguro de cómo pasarla a app.get() correctamente.

ERROR

 ReferenceError: data is not defined

CÓDIGO

 const express = require('express') const axios = require('axios') const app = express() const url = "**Youtube API URL**" axios.get(url) .then((response) => { let data = response.data.items console.log("Posted data") console.log(data) }) .catch( err => console.log(err) ) app.get("/youtube", (req,res) => { res.send(data) }) app.listen(5000, () => {console.log("server started on port 5000")})
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Los datos no están definidos en su ruta porque están definidos dentro de la devolución de llamada de su axios get callback. Incluso si se definiera antes de la llamada axios, aún no estaría definido porque la llamada API es una operación asíncrona...

Una solución simple sería hacer la llamada axios dentro de su devolución de llamada de ruta y enviar la respuesta dentro de la devolución de llamada axios. Aunque hay toneladas de técnicas/patrones de codificación para resolver este problema, esto ayuda a ilustrar su problema:

 app.get("/youtube", (req,res) => { axios.get(url) .then((response) => { let data = response.data.items console.log("Posted data") console.log(data) res.send(data) }) .catch( err => console.log(err) ) })

Por supuesto, podría crear una función asíncrona y llamarla desde dentro de la ruta:

 async function makeCall() { const data = await axios.get(url) .then((response) => { let resdata = response.data.items return resdata }) .catch( err => console.log(err) ) return data; }

Luego en tu ruta:

 app.get("/youtube", async (req,res) => { const data = await makeCall(); res.send(data); }

Almacenar en caché los datos de la respuesta para que estén fácilmente disponibles es otro problema por completo...

about 4 years ago · Juan Pablo Isaza Relatório

0

Gracias a todos por su percepción. Terminé adoptando el enfoque de almacenamiento en caché para poder lidiar con el límite de velocidad de API del servicio del que estoy extrayendo. Realizo una llamada desde la API al comienzo de mi archivo server.js y agregué una función setInterval para extraer de la API cada 30 minutos para actualizar los datos y luego almacenarlos en un caché. Luego extraigo esos datos del caché y los envío a mi punto de conexión express "/youtube".

Aquí está mi código de trabajo con la esperanza de que ayude a cualquier otra persona que tenga los mismos problemas que yo.

servidor.js

 const axios = require('axios') const NodeCache = require('node-cache') const express = require('express') const cors = require('cors') const app = express() app.use(cors()) const port = process.env.PORT || 4000 const url = " **Youtube API url** " const myCache = new NodeCache(); function initialCall(){ axios.get(url) .then((response) => { const result = response.data.items myCache.set("key", result) console.log("Retrived from API") }) .catch( err => console.log(err) ) } initialCall() setInterval(initialCall, 1800000) app.get("/", (req,res) => { const welcome = "Welcome" res.send(welcome) }) app.get("/youtube", (req,res) => { if(myCache.get("key")){ res.send(myCache.get("key")) console.log("Retrieved from cache") } }) app.listen(port, () => {console.log(`server started on port: ${port} `)})
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda