嵌套的.then我无法将重新发送给浏览器

时间:2019-03-05 10:46:16

标签: javascript node.js express

使用express.js

我有2个提供相同类型数据的API,我有一个简单的APP,我想使用第一个...如果返回错误,我想转到下一个...

我尝试的方法是使用“嵌套”:

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”结果,不起作用,也通过下面的要求,不起作用。 / p>

我有什么选择?

2 个答案:

答案 0 :(得分:1)

then的{​​{1}}的最后一个res块中,引用然后回调的参数res.send

应该是:

res

并且您的链接也没有达到您期望的效果。 .then(function() { // removed res here if (apiServer == 'server2') { 捕获then? after the捕获is call all the time, so if the code before the发送。

does not fail then you have two看起来像一个全局变量,但是可能有多个并发请求,那么就可以设置apiServer,因为它会被再次读取。

代码应如下所示:

apiServer

答案 1 :(得分:0)

您在相同的上下文/范围内两次shadowing个变量,这通常是一种不好的做法。此外,您最终将使自己和他人阅读您的代码感到困惑。您可以简单地将变量的名称从res更改为response1response2(只是为了给出一个主意...您可以相应地命名),以避免产生阴影。同时从第三个res

中删除.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);
        });
    }
  })
);

希望这会有所帮助。编码愉快!