首页 > 解决方案 > 如何按顺序/同步进行 API 调用 - EMFILE 错误

问题描述

我正在尝试使用从 GET 请求收到的数据填充数据库。每个请求返回 500 个项目,这反过来向数据库发送 500 个 POST。有 686 个 GET 请求要发出。我遇到的问题是在第三次 GET 之后,我开始接收Error: connect EMFILE并最终在数据库中只有约 1700 个项目。

我将如何顺序/同步地进行这些 API 调用以避免这种情况?

function getProducts(myUrl) {
    axios.get(myUrl, { httpsAgent: agent })
        .then(res => {
            res.data.products.forEach(product => {
                var product = {
                    'values': {
                        '2': product.name,
                        '3': product.display_price,
                        '4': product.slug
                    }
                };
                postProduct(product);
            });
        })
        .catch(err => {
            console.log(err);
        });
}

function postProduct(product) {
    axios.post(huburl, product)
    .then(res => {
        console.log(res.data);
    })
    .catch(err => {
        console.log(err)
    });
}

for (let i = 1; i <= 686; i++) {
    var pagedUrl = url + '&page=' + i;
    console.log(pagedUrl);
    getProducts(pagedUrl);
}

标签: javascriptnode.jsapiaxios

解决方案


这是一个到 async/await 的简单转换,我说过我会在评论中发布。

async function getProducts(myUrl) {
  try {
    let res = await axios.get(myUrl, {
      httpsAgent: agent
    });
    res.data.products.forEach(product => {
      var product = {
        'values': {
          '2': product.name,
          '3': product.display_price,
          '4': product.slug
        }
      };

      await postProduct(product);

    });

  } catch (e) {
    console.log(e);
  }
}

async function postProduct(product) {
  try {
    let res = await axios.post(huburl, product);
    console.log(res.data);

  } catch (e) {
    console.log(e);
  }
}

for (let i = 1; i <= 686; i++) {
  var pagedUrl = url + '&page=' + i;
  console.log(pagedUrl);
  await getProducts(pagedUrl);
}


推荐阅读