Escribo un código para obtener información.
const stock = await Stock.find({ exchange: exchange }); // Here stock array length is 5300 stock.forEach(async (stockEl) => { const EOD_API = process.env.EOD_HISTORICAL_API const {data} = await axios.get(`https://eodhistoricaldata.com/api/fundamentals/${stockEl.code}?api_token=${EOD_API}&filter=General::Industry`); console.log(data); }); Aquí coloco una solicitud de obtención para cada elemento de matriz de existencias mediante la función forEach . Luego me da error como imagen- Click para ver imagenes
Pero cuando lo coloco fuera de la función forEach así:
const EOD_API = process.env.EOD_HISTORICAL_API const {data} = await axios.get(`https://eodhistoricaldata.com/api/fundamentals/${stockEl.code}?api_token=${EOD_API}&filter=General::Industry`); console.log(data);Entonces no da error. Para Remembering Stock tiene 5300 elementos, eso significa que axios se ejecuta 5300 veces.
¿Alguna solución o idea?
Esperar en forEach no detiene el proceso ya que forEach no reconoce promesas. Prueba esto en su lugar:
(async () => { for (let index = 0; index < stock.length; index++) { const EOD_API = process.env.EOD_HISTORICAL_API const {data} = await axios.get(`https://eodhistoricaldata.com/api/fundamentals/${stock[i].code}?api_token=${EOD_API}&filter=General::Industry`); console.log(data); } })();Necesitas hacer algunos cambios:
Reemplace forEach con for porque forEach no es consciente de la promesa
Use probar, atrapar => atrapar cualquier error
Use Promise.allSettled => le permite ejecutar todas las promesas juntas sin tener que esperar entre sí, lo que a cambio mejorará el rendimiento de su aplicación. Devuelve una matriz con estado ("cumplido", "rechazado")
const fetchSingleStockElement = async (stockEl) => { try { const EOD_API = process.env.EOD_HISTORICAL_API, { data } = await axios( `https://eodhistoricaldata.com/api/fundamentals/${stockEl.code}?api_token=${EOD_API}&filter=General::Industry` ); return data; } catch (err) { throw new Error(err); } }; const fetchAllStockData = async () => { let promisesArray = []; try { //fetch stock array const { data } = await Stock.find({ exchange: exchange }); //fetch single stock for (let i = 0; i < data.length; i++) { promisesArray.push(fetchSingleStockElement(data[i].id)); } const results = await Promise.allSettled(promisesArray); console.log('results', results); } catch (err) { console.log('results error', err); }};
Aquí hay un ejemplo de trabajo con una API falsa de 4466 entradas:
const fetchSingleAirline = async (airlineId) => { try { const { data } = await axios(`https://api.instantwebtools.net/v1/airlines/${airlineId}`); return data; } catch (err) { throw new Error(err); } }; const fetchAllAirlineData = async () => { let promisesArray = []; try { const { data } = await axios('https://api.instantwebtools.net/v1/airlines'); for (let i = 0; i < data.length; i++) { promisesArray.push(fetchSingleAirline(data[i].id)); } const results = await Promise.allSettled(promisesArray); console.log('results', results); } catch (err) { console.log('results error', err); } };