I am working on a project where I need to make multiple requests to a third party API and then send back an array of the data recieved to the client. Obviously the requests to the to the third party API are async, and if I put the res.json immediately after the request loop, the data will be empty. Do I need to wrap the request in a promise? Here is my code:
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);
        });
      }
    }
  });
};
 
    