发出多个api / http node.js请求很困难

时间:2019-04-25 20:44:08

标签: javascript node.js

您好,我有两个api请求可以单独工作,但是要让它们都在我的node.js应用程序上工作都遇到了很多麻烦。有简单的方法可以发出两个请求吗?我尝试过发出两个请求,将数据放入变量中,然后渲染它们两个,但是遇到全局变量问题。任何帮助,将不胜感激。

  request(url, function (err, response, body) {

    if(err){
      res.render('index', {weather: null, error: 'Error, please try again'});
    } else {
      let weather = JSON.parse(body);

      if(weather.main == undefined){
        res.render('index', {weather: null, error: 'Error, please try again'});
      } else {
        if (rain == "0,rain"){
        let weatherText = `It's ${weather.main.temp} degrees celsius and with wind speeds of ${weather.wind.speed} mph in ${weather.name} ${weather.sys.country}! & ${weather.weather[0].description}`  ;
        res.render('index', {weather: weatherText, error: null});
      }
      else{
        let weatherText = `It's ${weather.main.temp} degrees celsius and with wind speeds of ${weather.wind.speed} mph in ${weather.name} ${weather.sys.country}!`  ;
        res.render('index', {weather: weatherText, error: null});
      }
      }
    }

  });
request(url2, function (err, response, body) {
  if(err){
    res.render('index', {news: null, error: 'Error, please try again'});
  } else {
    let result = JSON.parse(body);
    let news = result.articles[0].title
    if(news == undefined){
      res.render('index', {news: null, error: 'Error, please try again'});
    } 
    else{

      res.render('index', {news:news, error: null});
    }
    }
  })

2 个答案:

答案 0 :(得分:0)

我会使用“承诺”来等待,直到您收到第一个请求的回复。一旦发生这种情况,您可以触发第二个请求(请参见下面的链接中的“然后”)。一旦第二个请求返回结果,您就可以在使用数据之前合并两个请求的响应。

如果请求B需要使用请求A响应中的数据,则请求A应该位于链中的第一位。这样您就可以根据第一个请求的响应来调整第二个请求,例如与IF语句。如果两者完全独立,则可以选择其中一个请求。

此链接上有一节关于链接承诺,该章节应与您要执行的操作有关:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

有关使用promise和'catch'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

处理错误的详细信息

答案 1 :(得分:0)

实际不需要使用promise,尽管它们确实简化了代码结构,但是您可以轻松地嵌套请求:

request(url, function(err, response, body) {
    request(url2, function(err2, response2, body2) {
        // Both request data is available here
    })
})

请注意,可以在此处更改回调函数中使用的变量名

如果您有一堆可以独立运行的请求,请查看promise.all