繁体   English   中英

运行 axios 获取请求时收到 400 错误代码?

[英]Getting 400 error code when I run axios get request?

我写了一些代码来获取信息

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);
});

在这里,我通过forEach function 对每个股票数组元素发出请求。 然后它给我像图像一样的错误-点击查看图像

但是当我像这样将它放在 forEach function 之外时-

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);

然后它没有错误。 因为记忆股票有 5300 个元素,这意味着 axios 运行 5300 次。

任何解决方案或想法?

在 forEach 中执行 await 不会保留该过程,因为 forEach 不是承诺感知的。 试试这个:

(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);
    }
})();

更多信息

您需要进行一些更改:

  • 将 forEach 替换为 for 因为 forEach 不支持 promise

  • 使用 try, catch => 捕获任何错误

  • 使用 Promise.allSettled => 它允许您一起运行所有承诺,而无需相互等待,这反过来会提高您的应用程序性能。 它返回一个状态为 ("fulfilled", "rejected") 的数组

    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); }

    };

这是一个带有 4466 个条目的假 API 的工作示例:

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);
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM