2017-07-24 41 views
0

我对Node.js非常陌生,以前一直没有用过json数据,所以真的希望你能帮助我。如何从多个url页面获取json数据Node.js?

我想从特玛的API的所有事件信息和具体的变量添加到MongoDB的。但是,我目前使用的API'限于每页200个事件。因此,我不可能将活动信息与场地信息连接起来,因为这些信息单独添加到mongoDB中,并没有详尽列出所有活动和场地信息(由于缺少活动和场地数据而无法连接到ID)。

因此,我的问题是关于我如何能得到的所有页面到我的数据库在一次?

,我至今写的代码看起来像下面的东西:

app.get('/tm', (req, res) => { 
 
    axios // getting venues 
 
    .get('https://app.ticketmaster.com/discovery/v2/venues.json?apikey=myApiKey&page=0&size=200&countryCode=DK') 
 
    .then(response => { 
 
     const venuesToBeInserted = response.data._embedded.venues.map(venue => { // preparing venues 
 
     return { 
 
      sourceID: venue.id, 
 
      venue: venue.name, 
 
      postalCode: venue.postalCode, 
 
      city: venue.city.name, 
 
      country: venue.country.name, 
 
      countryCode: venue.country.countryCode, 
 
      address: !!venue.address ? venue.address.line1 : null, 
 
      longitude: !!venue.location ? venue.location.longitude : null, 
 
      latitude: !!venue.location ? venue.location.latitude : null, 
 
      source: 'ticketmaster' 
 
     } 
 
     }) 
 

 
     // Create all venues at once 
 
     Venue.create(venuesToBeInserted).then(venues => { 
 
     console.log("venues inserted") 
 

 
     axios // getting events and shows - note the page parameter in the api link 
 
     .get('https://app.ticketmaster.com/discovery/v2/events.json?apikey=myApiKey&countryCode=DK&size=200&page=0') 
 
     .then(response => { 
 
      const eventsToBeInserted = response.data._embedded.events.map(events => { // preparing events 
 
      const event = events._embedded.attractions[0] 
 
      return { 
 
       sourceID: event.id, 
 
       name: event.name, 
 
       slug: slugify(event.name).toLowerCase(), 
 
       tags: !!event.classifications ? [event.classifications[0].genre.name, event.classifications[0].subGenre.nam] : [], // duplicate genres occur 
 
       // possible tags from ticketmaster: type and subtype 
 
      } 
 
      }) 
 

 
      // Create all events at once 
 
      Event.create(eventsToBeInserted).then(events => { 
 
       console.log("events inserted") 
 

 
       const showsToBeInserted = response.data._embedded.events.map(show => { 
 
       const event = events.find(event => event.sourceID == show._embedded.attractions[0].id); 
 
       const venue = venues.find(venue => venue.sourceID == show._embedded.venues[0].id); 
 

 
       if (!!event && !!venue) { 
 
        return { 
 
        event: event._id, 
 
        venue: venue._id, 
 
        timezone: show.dates.timezone, 
 
        dateStart: !!show.dates.start.dateTime ? show.dates.start.dateTime : show.dates.start.localDate, 
 
        tickets: !!show.priceRanges ? { 
 
         minPrice: show.priceRanges[0].min, 
 
         maxPrice: show.priceRanges[0].max, 
 
         currency: show.priceRanges[0].currency 
 
        }: {} 
 
        } 
 
       } 
 
       }) 
 
       // Let's see what we have created in the database 
 
       Venue.find({}).select({ 
 
        name: 1, 
 
        slug: -1 
 
       }).limit(10).populate('event').populate('venue').then(events => { 
 
        console.log(util.inspect(events)); 
 
       }).catch(err => { 
 
        console.error(err); 
 
       }); 
 
      }).catch(err => { 
 
       console.error(err) 
 
      }) 
 

 
      }).catch(err => { 
 
       console.error(err) 
 
      }) 
 
     }).catch(err => { 
 
      console.error(err) 
 
     }); 
 
    }).catch(err => { 
 
    console.error(err) 
 
    }) 
 
})

编辑

使用杰克建议给了我一个错误(方法错误:请求失败状态码为401)。我试图在网上搜索它,但我无法弄清楚为什么会发生错误。在我的console.log中查看部分错误消息的图片。

error message

回答

0

可以使用的承诺,你已经在使用做到这一点,你只需要他们链在一起使用递归。

function getVenues(page, size, venues) { 
    page = page || 0; 
    size = size || 200; 
    venues = venues || []; 
    return axios 
     .get(`https://app.ticketmaster.com/discovery/v2/venues.json?apikey=myApiKey&page=${page}&size=${size}&countryCode=DK`) 
     .then(response => response.data._embedded.venues) 
     .then(rawVenues => { 
      rawVenues.forEach(venue => venues.push(venue)); 
      if (rawVenues.length < size) { 
       // All done return the compiled list. 
       return venues; 
      } 
      // Recurse over the next set of venues by adding another promise to the chain. 
      return getVenues(page + 1, size, venues); 
     }); 
} 

function getEvents(page, size, events) { 
    page = page || 0; 
    size = size || 200; 
    events = events || []; 
    return axios 
     .get(`https://app.ticketmaster.com/discovery/v2/events.json?apikey=myApiKey&countryCode=DK&size=${size}&page=${page}`) 
     .then(response => response.data._embedded.events) 
     .then(rawEvents => { 
      rawEvents.forEach(event => events.push(event)); 
      if (rawEvents.length < size) { 
       // All done return the compiled list. 
       return events; 
      } 
      // Recurse over the next set of events by adding another promise to the chain. 
      return getEvents(page + 1, size, events); 
     }); 
} 

app.get('/tm', (req, res) => { 
    getVenues().then(rawVenues => { 

     const venuesToBeInserted = rawVenues.map(venue => { 
      return { 
       sourceID: venue.id, 
       venue: venue.name, 
       postalCode: venue.postalCode, 
       city: venue.city.name, 
       country: venue.country.name, 
       countryCode: venue.country.countryCode, 
       address: !!venue.address ? venue.address.line1 : null, 
       longitude: !!venue.location ? venue.location.longitude : null, 
       latitude: !!venue.location ? venue.location.latitude : null, 
       source: 'ticketmaster' 
      }; 
     }); 

     // Return promise so errors bubble up the chain... 
     return Venue.create(venuesToBeInserted).then(venues => { 
      console.log("venues inserted"); 

      // Return promise so errors bubble up the chain... 
      return getEvents().then(rawEvents => { 

       const eventsToBeInserted = rawEvents.map(rawEvent => { 
        const event = events._embedded.attractions[0]; 
        return { 
         sourceID: event.id, 
         name: event.name, 
         slug: slugify(event.name).toLowerCase(), 
         tags: !!event.classifications ? [event.classifications[0].genre.name, event.classifications[0].subGenre.nam] : [] 
        }; 
       }); 

       // Return promise so errors bubble up the chain... 
       return Event.create(eventsToBeInserted).then(events => { 
        console.log("events inserted"); 

        const showsToBeInserted = rawEvents.map(show => { 
         const event = events.find(event => event.sourceID == show._embedded.attractions[0].id); 
         const venue = venues.find(venue => venue.sourceID == show._embedded.venues[0].id); 

         if (!!event && !!venue) { 
          return { 
           event: event._id, 
           venue: venue._id, 
           timezone: show.dates.timezone, 
           dateStart: !!show.dates.start.dateTime ? show.dates.start.dateTime : show.dates.start.localDate, 
           tickets: !!show.priceRanges ? { 
            minPrice: show.priceRanges[0].min, 
            maxPrice: show.priceRanges[0].max, 
            currency: show.priceRanges[0].currency 
           } : {} 
          } 
         } 
        }); 

        // Do something with the found shows... 
       }); 
      }); 
     }); 
    }).then(() => { // This then is fired after all of the promises above have resolved... 
     return Venue.find({}).select({ 
      name: 1, 
      slug: -1 
     }).limit(10).populate('event').populate('venue').then(events => { 
      console.log(util.inspect(events)); 
      res.send(events); 
     }); 
    }).catch(err => { // Catches any error during execution. 
     console.error(err); 
     res.status(500).send(err); 
    });; 
}); 
+0

感谢您的帮助杰克。但是我收到一条错误消息。请参阅我在上面的帖子中的编辑。我不知道错误是什么意思.. –

+0

401意味着你是未经授权的,它看起来像错误消息说你的MongoDB是安全的,并需要用户名/密码来建立与Mongoose的连接。 –

+0

看起来您并未在请求URL中设置真实的API密钥,该值在响应中为'apiKey',您需要发送在请求URL中提供给您的API密钥。 –