Узел - Получение ошибки ECONNRESET при выполнении http-запроса с axios - PullRequest
1 голос
/ 17 февраля 2020

У меня есть функция в Node, которая должна выбрать всех пользователей из Azure AD (я использую Microsoft Graph и Ax ios).

Эта функция запрашивает Microsoft Graph, ответ включает в себя массив пользователей. Максимальное количество объектов в этом массиве ограничено 999. Если есть больше пользователей, этот ответ также будет включать @odata.nextLink. Я планировал запросить запрос, и, если в ответе есть @odata.nextLink, повторяйте запрос до тех пор, пока не будет @odata.nextLink. Не совсем уверен, есть ли другой способ сделать это лучше.

async function fetchUsers(tokenEndpoint, client_id, client_secret, query) {
  try {
    let allUsers = [];
    let bearer = `Bearer ${await fetchToken(
      tokenEndpoint,
      client_id,
      client_secret
    )}`;
    let res = await fetchData(bearer, `${msAPI}${query}`);
    if (res.status === 200) {
      allUsers.push(...res.data.value);
      console.log(allUsers.length);
      let nextURL = res.data["@odata.nextLink"];
      while (nextURL != undefined) {
        bearer = `Bearer ${await fetchToken(
          tokenEndpoint,
          client_id,
          client_secret
        )}`;
        res = await fetchData(bearer, nextURL);
        allUsers.push(...res.data.value);
        nextURL = res.data["@odata.nextLink"];
        console.log(allUsers.length);
      }
    }
    return allUsers;
  } catch (err) {
    handleError(err);
  }
}

async function fetchToken(tokenEndpoint, client_id, client_secret) {
  try {
    const res = await axios.post(
      tokenEndpoint,
      qs.stringify({
        client_id,
        client_secret,
        grant_type: "client_credentials",
        scope
      })
    );
    return res.data.access_token;
  } catch (err) {
    handleError(err);
  }
}

async function fetchData(bearer, url) {
  try {
    const res = await axios.get(url, {
      headers: {
        Authorization: bearer
      }
    });
    return res;
  } catch (err) {
    handleError(err);
  }
}

I have this statement in another async function
const allUsers = await fetchUsers(tokenEndpoint,clientId,clientSecret,query);

Иногда это работает отлично, и я получаю всех моих Azure пользователей AD, а иногда я получаю ошибку ECONNRESET в середине функция выполняется, и она не будет завершена sh. Эта ошибка, по-видимому, возникала несколько раз в одной сети, затем я проверил в другой сети и не получил ошибку ни разу. Вернулся к исходной сети и снова получил ошибки. Не уверен, что это проблема сети или то, как я выполняю запросы Ax ios в моем l oop.

Независимо от того, как мне go решить эту проблему ECONNRESET?

1 Ответ

0 голосов
/ 18 февраля 2020

ECONNRESET возникает, когда TCP внезапно закрывается. Это может быть вызвано сбоем в вашей локальной сети, удаленной службе или где-то между ними.

Наиболее вероятная причина здесь - запрос $top=999. Это слишком большой (и, следовательно, длинный) размер страницы. Вы должны установить это значение на меньшее или, в идеале, оставить значение по умолчанию. Это обеспечивает разумные размеры страниц, быстрое выполнение запросов и помогает избежать возможного ограничения AAD.

Ваш план «следуй каждому» @odata.nextLink является правильным шаблоном для использования. Это позволяет вам перетащить страницу данных и обработать ее перед выполнением последующих запросов на дополнительные страницы. Между запросами вы захотите сохраните текущее значение @odata.nextLink, поэтому, если что-то пойдет не так, вы можете выбрать, где остановились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...