Как поймать пустой ответ из API {} - PullRequest
2 голосов
/ 18 апреля 2019

В настоящее время я использую Node.js для извлечения данных API и преобразования их в свой собственный сервер API Express.js для отправки своих собственных данных (2 API, которые я использую, иногда меняют структуру, и у меня есть некоторые пользователи, которыенужно сохранить ту же структуру).

Так вот код, который я использую

app.get('/app/account/:accountid', function (req, res) {
    return fetch('https://server1.com/api/account/' + req.params.accountid)
      .then(function (res) {
      
      var contentType = res.headers.get("content-type");
      if (contentType && contentType.includes("application/json")) {
          apiServer = 'server1';
          return res.json();
      } else {
        apiServer = 'server2';
        throw "server1 did not reply properly";
      }
    }).then(server1Reconstruct).then(function (json) {
      res.setHeader('Content-Type', 'application/json');
      return res.send(json);
    }).catch(function (err) {
      console.log(err);
    }).then(function () {
      if (apiServer == 'server2') {
        server2.fetchAccount({
          accountID: [Number(req.params.accountid)],
          language: "eng_us"
        })
        .then(server2Reconstruct)
        .then(function (json) {
          res.setHeader('Content-Type', 'application/json');
          return res.send(json);
        }).catch(function (err) {
          console.log(err);
        });
      }
    });
  })

Чтобы быстро объяснить код: я вызываю server1 через обычную Fetch, этот ответ может быть {}, и именно здесь у меня проблема.Если accountid не существует, сервер возвращает ответ JSON без ошибок, чтобы захватить ...

Что мне нужно сделать, чтобы его перехватить ... И если я поймаю его, переключитесь на сервер 2.

(Не смущайтесь вызовом server2, поскольку это другой пакет).

1 Ответ

2 голосов
/ 18 апреля 2019

Если я правильно понимаю вашу проблему, вы должны выполнить следующие шаги:

  • получить исходный API
  • вызвать метод .json() для результата - который возвращает обещание
  • имеет дело с ответом json в первом .then(json => ...), и здесь проверьте, равен ли результат {}, затем вызовите server2, иначе вызовите server1

Кстати, ваш код выглядит очень грязносо всеми этими then и catch я рекомендую помещать некоторые вещи в функции и использовать async/await, если можете.

Вот пример псевдокода, который вы можете использовать:

function server2Call() {
    return server2.fetchAccount({
        accountID: [Number(req.params.accountid)],
        language: 'eng_us'
    })
        .then(server2Reconstruct)
        .then(function (json) {
            res.setHeader('Content-Type', 'application/json');
            return res.send(json);
        }).catch(function (err) {
            console.log(err);
        });
}

app.get('/app/account/:accountid', function (req, res) {
    return fetch('https://server1.com/api/account/' + req.params.accountid)
        .then(res => {
            var contentType = res.headers.get('content-type');
            if (contentType && contentType.includes('application/json')) {
                return res.json();
            } else {
                server2Call()
            }
        })
        .then(json => {
            res.setHeader('Content-Type', 'application/json');
            if (json is {}) return server2Call()
            else return res.send(json);
        }).catch(function (err) {
            console.log(err);
        })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...