Вложенный .hen, и я не могу отправить res.send обратно в браузер - PullRequest
1 голос
/ 05 марта 2019

Использование express.js

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

То, что я попробовал, это с помощью "вложенных" тогда:

app.get('/player/:userID', (req, res) =>
  fetch('https://api1.com/api/user/' + req.params.userID + '/')
  .then(function(res) {
    var contentType = res.headers.get("content-type");
    if (contentType && contentType.includes("application/json")) {
      apiServer = 'swgohgg';
      return res.json();
    } else {
      apiServer = 'server2';
      throw ("server 1 did not reply properly");
    }
  })
  .then(json => res.send(json))
  .catch(function(err) {
    console.log(err);
  })
  .then(function(res) {
    if (apiServer == 'server2') {
      fetch('https://api2.com/api/user/' + req.params.userID + '/')
        .then(function(res) {
          var contentType = res.headers.get("content-type");
          if (contentType && contentType.includes("application/json")) {
            return res.json();
          }
        })
        .then(json => res.end(json))
        .catch(function(err) {
          console.log(err);
        });
    }
  })
);

Таким образом, я устанавливаю переменную пустой, если она терпит неудачу, она генерирует ошибку перехода, чтобы поймать, затем она запускает второй вызов API, но когда она отправляет res.send, она говорит мне, что "TypeError: res.send не является функция».

И все идет на ветер ... И я не получаю никакого ответа.

Я пробовал несколько других вещей, которые нашел здесь, но, похоже, ничего не работает ... Один говорил, что нужно изменить "res" на результат, не работает, передать требование также ниже, нет.

Какие у меня варианты?

Ответы [ 2 ]

1 голос
/ 05 марта 2019

В последнем then блоке res из res.send ссылается на параметр res вашего обратного вызова.

Так должно быть:

  .then(function() { // removed res here
    if (apiServer == 'server2') {

И ваша цепочка не делает то, что вы ожидаете, что он должен тоже.then? after the catch is call all the time, so if the code before the catch does not fail then you have two send`.

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

Код должен выглядеть примерно так:

app.get('/player/:userID', (req, res) =>
  let apiServer

  fetch('https://api1.com/api/user/' + req.params.userID + '/')
  .then(function(res) {
    var contentType = res.headers.get("content-type");
    if (contentType && contentType.includes("application/json")) {
      apiServer = 'swgohgg';
      return res.json();
    } else {
      apiServer = 'server2';
      throw new Error("server 1 did not reply properly");
    }
  })
  .catch(function(err) {
    console.log(err);

    // in case of an error do a different request
    if (apiServer == 'server2') {
      return fetch('https://api2.com/api/user/' + req.params.userID + '/')
        .then(function(res) {
          var contentType = res.headers.get("content-type");
          if (contentType && contentType.includes("application/json")) {
            return res.json();
          }
        })
    } else {
       throw new Error('invalid fallback server')
    }
  })
  .then(json => res.send(json))
  .catch(function(err) {
    console.log(err);
  });
});
0 голосов
/ 05 марта 2019

Вы следите за вашими переменными дважды в одном контексте / области видимости, что, как правило, является плохой практикой.Кроме того, вы будете путать себя и других, читающих ваш код.Вы можете просто изменить имя вашей переменной с res на response1 & response2 (просто чтобы дать представление ... вы можете дать соответствующее имя), чтобы избежать затенения.Также удалите res из 3-го .then

app.get('/player/:userID', (req, res) =>
  fetch('https://api1.com/api/user/' + req.params.userID + '/')
  .then(function (response1) {
    var contentType = response1.headers.get("content-type");
    if (contentType && contentType.includes("application/json")) {
      apiServer = 'swgohgg';
      return response1.json();
    } else {
      apiServer = 'server2';
      throw ("server 1 did not reply properly");
    }
  })
  .then(json => res.send(json))
  .catch(function (err) {
    console.log(err);
  })
  // removed res from argument
  .then(function () {
    if (apiServer == 'server2') {
      fetch('https://api2.com/api/user/' + req.params.userID + '/')
        .then(function (response2) {
          var contentType = response2.headers.get("content-type");
          if (contentType && contentType.includes("application/json")) {
            return response2.json();
          }
        })
        //fixed res.end to res.send cause it was throwing an error
        .then(json => res.send(json))
        .catch(function (err) {
          console.log(err);
        });
    }
  })
);

Надеюсь, это поможет.Удачного кодирования!

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