向第三方API Node.js发出多个请求后如何发送响应

我正在做一个项目,我需要向第三方API发出多个请求,然后将接收到的数据数组发回给客户端。显然,对第三方API的请求是异步的,如果我在请求循环后立即放置res.json,则数据将为空。我是否需要将请求包装在Promise中?这是我的代码:

const historicalForecast = (req, res, next) => {
  console.log(req.body);
  // GET COORDS FROM GOOGLE API BY LOCATION INPUT BY USER
  let googleUrl = `https://maps.googleapis.com/maps/api/geocode/json?address=${req.body.input}&key=${googleKey}`;
  request(googleUrl, function(error, response, body){
    if(error){
      console.log(error);
      next();
    }
    let data = JSON.parse(response.body);
    //IF MORE THAN ONE RESULT FROM GEOLOCATION QUERY
    //ADD DATES REQUESTED INTO RESPONSE AND
    //SEND LIST OF LOCATIONS BACK SO USER CAN CHOOSE
    if(data.results.length > 1){
      response.body.startDate = req.body.startDate;
      response.body.endDate = req.body.endDate;
      res.json(JSON.parse(response.body));

    //IF ONE RESULT, GET DATA IN BATCHES
    }else if(data.results.length === 1) {
      let coords = data.results[0].geometry.location;
      const OneDay = 86400;
      let timeFrame = Math.abs(req.body.startDate - req.body.endDate);
      let numberOfDays = timeFrame/OneDay;
      console.log(numberOfDays);
      let results = [];

      for(let i = 0; i < numberOfDays; i++){
        let currentDay = Number(req.body.startDate) + (i*OneDay);
        let urlWeather = `https://api.forecast.io/forecast/${weatherKey}/${coords.lat},${coords.lng},${currentDay}`;
        request(urlWeather, function(error, response, body){
          if(error){
            console.log(error);
            next();
          }
          results.push(JSON.parse(response.body));
          res.send(results);
        });
      }
    }
  });
};

根据@ jfriend00的建议,我查看了:

Node.JS如何在当前范围之外设置变量

并使用那里提供的众多选项之一。我的解决方案在上面的帖子中。将为该帖子添加书签,以备将来参考。

我将else if语句中的所有代码替换为:

  let coords = data.results[0].geometry.location;
  const OneDay = 86400;
  let timeFrame = Math.abs(req.body.startDate - req.body.endDate);
  let numberOfDays = timeFrame/OneDay;


  const makeMultipleQueries = (url) => {
    return new Promise(function(resolve, reject) {
      request(url, function(error, response, body){
        if(error){
          reject(error);
        }
        resolve(response.body);
      });
  });
};

let promises = [];
for (let i = 0; i < numberOfDays; i++) {
  let currentDay = Number(req.body.startDate) + (i*OneDay);
  let url = `https://api.forecast.io/forecast/${weatherKey}/${coords.lat},${coords.lng},${currentDay}`;
  promises.push(makeMultipleQueries(url));
}
Promise.all(promises).then(function(results) {
    res.json(results);
}, function(err) {
    next(err);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Node.js下载文件(不使用第三方库)?

如何上传作为第三方API响应的文件

测试Go(Golang)API传出请求而未实际击中第三方API

没有任何第三方模块的情况下,如何在Node Js中进行https发布?

node.js-PM2记录未捕获到的第三方服务异常(作为Logentries)

从MS Office加载项向第三方服务器发出AJAX请求

如何在Vapor中提出连接第三方API的请求?

无法发出第三方API请求

创建发出第三方API请求的Firebase API

如何获取TypeScript从node_modules捆绑第三方库?

我如何向第三方私有Docker注册中心验证GKE?

如何使用工厂模式来解析多个第三方api

Node / Express应用程序可查询第三方API并将响应存储在memcache / redis中30分钟以备将来查询

使用express.router();使用api密钥向第三方API发出get请求。

如何根据第三方API响应添加窗口小部件字段?

如何使用Bot Builder向第三方服务发出经过身份验证的请求?

如何向第三方服务器发出承诺电话?

从Angular / NodeJS / ExpressJS向第三方URL的POST请求

向需要身份验证的第三方发出API请求

无法向第三方应用发出发布请求

ImageJ:如何使用第三方插件API?

如何使用ASP.NET Web API向第三方公开URL

如何向第三方库添加方法

如何从第三方API保存JSON对象

如何使用 AWS Transfer 使用 Node.js 将文件从 AWS 移动到第三方

使用 GET 请求向第三方 API 发送标头

在 WooCommerce 中下订单后,根据订单元数据向第三方发送邮件

node.js 如何管理两个第三方包

如何为第三方网站创建 API?