Youtube Api,如何使用nextPageToken解析所有视频?

时间:2017-04-23 08:40:40

标签: javascript json node.js request youtube-api

我正在使用Node.JS和"请求"图书馆https://github.com/request/request 我阅读了文档,尽管我只能请求来自频道的50个视频,但是从api服务器响应,有一个nextPageToken密钥,但我不明白如何让这个nextPageToken的请求链通过整条链。

`https://www.googleapis.com/youtube/v3/search?key=${key}&channelId=${channelId}&part=snippet,id&order=date&maxResults=50`;

我勾勒出这段代码

request({url:url}, function(err, response, body){
    let data = JSON.parse(body);
    for(let i = 0; i < Math.fround(data.pageInfo.totalResults / maxResults); i++){
        let newUrl = url + '&pageToken=' + data.nextPageToken;
        request({url: newUrl}, function(err, response, body){
            newUrl = url + '&pageToken=' + JSON.parse(body).nextPageToken;
            console.log(JSON.parse(body).nextPageToken);
        })
    }
})

在频道+450视频中,没有想到最佳解决方案并取得第一个请求的结果,除以所请求视频的最大数量,我得到9-10,然后每个周期结果10次,理论上每个请求都应该更新变量newUrl之后,再次访问服务器以获取新数据,然后再使用新的nextPageToken。

怎么样?

1 个答案:

答案 0 :(得分:0)

通常在处理API时,使用for循环是不公平的,您可能希望更慢地逐步执行请求。我的下面的示例使用简单的递归,但您可能希望在函数调用自身时添加超时。

let url = 'formatted url'
let videos = [];

function worker = (token, url) {
  
  //use the standard url if there is no token
  if (!token) {
    request({url:url}, function(err, response, body){
      let data = JSON.parse(body);
      //do something with data
      
      //if there is a next page token run worker again.
      if (data.nextPageToken) {
        let token = data.nexPageToken;
        
        return worker(token, url);
      } else {
        console.log('fin');
      }
      
   } else {
     //if there is a token use a new url
     let nurl = 'url + page token';
     
     request({url: url}, function(err, response, body) {
      
      let data = JSON.parse(body);
      //do something with data
      
      //if there is a token run the worker again
      
      if (data.nextPageToken) {
        let token = data.nextPageToken;
        return worker(token, url);
      } else {
        console.log('fin');
      }
      
     })
     
   }
}

worker(null, url);