Рубрики
Без рубрики

Как изящно обрабатывать сбои в клиенте API Node.js

Roger Jin, как изящно обрабатывать сбои в Node.js API ClientTherther – два факта жизни: вы дышите на воздухе, а ошибки будут происходить в ваших программах. Мы все испытали проблемы с подключением к Wi-Fi или внезапно упали на нас телефонный звонок. Прерывистые неудачи через интернет

Автор оригинала: FreeCodeCamp Community Member.

Роджером Джен

Есть два факта жизни: вы дышите на воздухе, а ошибки будут происходить в ваших программах.

Мы все испытали проблемы с подключением к Wi-Fi или внезапно упали на нас телефонный звонок. Прерывистые неудачи через интернет-работы статистически необычны в целом, но все же привязаны. Это означает, что для программистов все, что ждет ответа на сеть, подвержена ошибке.

Я архитектор для «системы управления контентом как услуга» называется Buttercms. Итак, я буду исследовать надежность, используя этот инструмент. Это состоит из:

  • Хостеренная панель инструментов для редакторов контента
  • API JSON для извлечения этого контента
  • SDK для интеграции Buttercms в родной код.

База данных, логика и административная панель инструментов – это услуга через веб-API. Вопрос: «Что вы можете сделать с неизбежными ошибками в вашем клиенте Node.js?» Ошибки на API клиента обязаны произойти – это то, что вы делаете с этим, что имеет значение больше всего.

В этой статье я прогуляю, как я добавил лучшее обращение с неудачами для JavaScript ButterCMS API клиент Отказ К концу этой статьи вы будете надеяться, что лучше понять, как иметь дело с провалом в своих собственных клиентах API.

Основное обращение с исключением

Для начала, давайте посмотрим на пример запроса API для извлечения сообщения в блоге из API масла:

butter.post.retrieve('example-post')  .then(function onSuccess(resp) {    console.log(resp.data);  });

Это будет работать, за исключением того, что он оставляет вас слеп на любые исключения, которые клиент может бросить на вас. Примечание Клиент API использует Обещания Чтобы получить данные блога. Держите это в виду, так как JavaScript принимает новое измерение посредством обещаний.

Обрабатывать исключения, используя обещание, пощечину о поймать () в конце.

Например:

butter.post.retrieve('example-post')  .catch(function onError(error) {    console.log(error);  });

Выполнено! Обещание JavaScript обрабатывает все ошибки для вас и выполняет OneRror () Перезвоните. Ошибка . Объект содержит очень полезную информацию о том, что пошло не так.

Если вы посмотрите под капотом клиента ButterCMS API, вы увидите, что он использует Axios. . Axios – это клиент на основе обещания, который работает в браузере и Node.js.

Исследование объекта ошибки AXIOIOS, которое вы вернетесь к обещанию, раскрывает следующую ошибку:

{data:Object, status:401, statusText:'Unauthorized', headers:Object, config:Object}

Код состояния HTTP сообщает мне, что была ошибка.

Лучшее обращение с исключением

Тип ошибок, которые вы получаете, будет зависеть от поведения API. Например, списки документации API ButterCMS все возможные ответы . Вы можете получить 400, 401 или 404 в зависимости от запроса.

Один из способов иметь дело с этими исключениями – это обрабатывать каждый статус по-другому. Например, вы можете обрабатывать ошибки:

butter.post.retrieve('example-post')  .catch(function onError(error) {    if (error.status === 400) {      console.log('Bad request, often due to missing a required parameter.');    } else if (error.status === 401) {      console.log('No valid API key provided.');    } else if (error.status === 404) {      console.log('The requested resource doesn\'t exist.');    }  });

Используя HTTP-статус как источник правды, вы можете интерпретировать причину ошибки, однако вы хотите.

Другие компании, такие как Полоса API клиент решить проблему с Тип ошибки на ответ. Ошибка . Типтатус Код сообщает вам, какой тип ошибки возвращается в ответ.

Со всем этим остается один последний вопрос. ” Что происходит, когда сетевой запрос времени выходит? “

Для API клиента любой запрос над сетью очень рискован. Сетевое подключение может быть роскоши, которую не может себе позволить.

Давайте рассмотрим, какое исключение ошибок вы получаете, когда это раз разумеется. Клиент API ButterCMS имеет значение по умолчанию 3000 мс или 3 секунды.

Взгляните на этот объект ошибки, когда это раз от обработчика исключений:

{code:'ECONNABORTED', message:String, stack:String, timeout:3000}

Как и любая хорошая ошибка объекта, у него много хороших деталей об исключении. Примечание. Этот объект ошибок отличается от того, который мы видели ранее. Одна разница в том, что Тайм-аут имущество. Это может быть полезно для устранения такого рода исключением уникальным способом.

Вопрос в том, – есть ли изящный способ справиться с этими видами исключения? »

Обработка сетевых ошибок

Одна идея состоит в том, чтобы автоматически повторить запрос после нее. Все, что ждет сетевой ответ, может потерпеть неудачу. Сбой происходит из-за обстоятельств вне вашего прямого контроля. Как разработчики, приятно контролировать, но жизнь приходит со многими исключениями.

Polly-JS Можно попытаться повторить действие, как только он обнаружит ошибку. Библиотека Polly-JS может обрабатывать исключения через обещание JavaScript. Это обещание ловит исключение в том случае, если все повторные попытки не выполнены и выполняет поймать () Отказ Но мы решили не использовать Polly-JS, потому что это дополнительная зависимость, которая добавляет strow на API клиента.

Один принцип дизайна в пьесе вот: «Маленькая копировальная паста лучше, чем дополнительная зависимость». Основная часть логики повторной группы минимальна и имеет именно то, что нам нужно решить проблему.

Суть автоматического восстановления возвращает обещание JavaScript:

function executeForPromiseWithDelay(config, cb) {  return new Promise(function (resolve, reject) {    function execute() {      var original = cb();
original.then(function (e) {        resolve(e);      }, function (e) {        var delay = config.delays.shift();
if (delay && config.handleFn(e)) {          setTimeout(execute, delay);        } else {          reject(e);        }      });    }
execute();  });}

Обещание имеет решить и Отклонить Обратные вызовы, инкапсулированные для автоматических повторных попыток. config.handlefn () Обратный вызов выясняет, какое состояние приведет к повторной попытке. config.deLays.shift () удалит первый элемент из списка и задержать следующую попытку.

Хорошие новости – это может удовлетворить конкретное состояние, прежде чем есть какие-либо повторные попытки. У библиотеки есть ручка () Функция для установки обратного вызова, которая оценивает условие. Вы говорите, сколько повторных попыток дают условие и окончательное обращение с исключением.

Client API ButterCMS имеет Повторите попытку возможности из коробки. Чтобы включить автоматические повторные попытки, которые вам нужна:

butter.post.retrieve('example-post')  .handle(function onError(error) {    // Only retry on time out    return error.timeout;  })  .executeWithAutoRetry(3)  .then(function onSuccess(resp) {    console.log(resp.data);  })  .catch(function onTimeoutError(error) {    if (error.timeout) {      console.log('The network request has timed out.');    }  });

ExecuteWithAutoretry () Стагрирует последующие запросы и повторные попытки, если есть неудача. Например, первая попытка будет потерпеть неудачу, а затем подождать 100 мс до второй попытки. Вторая попытка, если она не удастся, будет ждать 200 мс до третьего. Третья попытка будет ждать 400 мс до четвертой и окончательной попытки.

С помощью клиента API ButterCMS у вас есть хороший способ обработки исключений на основе обещания. Все, что вам нужно сделать, это настроить его по своему вкусу.

Заключение

Когда дело доходит до ошибок, вы можете либо похоронить голову в песке или справиться с неожиданным с благодатим и элегантностью. Любой клиентский API, который ожидает ответа через соединение, подвержен исключениям. Выбор твой на том, что делать, когда происходит ошибочное поведение.

Рассмотрим исключение как непредсказуемое поведение. Кроме того, потому что это непредсказуемо, не означает, что вы не можете заранее подготовиться. При обращении с исключениями, сосредоточиться на предвидении того, что пошло не так, а не логика приложений.

Сетевое подключение является одним из худших виновных сбоев. Обязательно подготовим заранее, чтобы дать запросы второго изменения в случае неисправного соединения.

Эта статья была первоначально опубликована на наших Блог Отказ

Для большего количества контента следуйте ButterCMS на Twitter Отказ

Оригинал: “https://www.freecodecamp.org/news/how-to-gracefully-handle-failures-in-a-node-js-api-client-605673cb72ab/”