2017-04-23 30 views
0

我正在使用Node.JS和「請求」庫https://github.com/request/request 我閱讀了文檔,儘管我只能從頻道請求50個視頻,作爲api服務器的響應,但有一個nextPageToken鍵,但我不明白如何讓這個nextPageToken的請求鏈遍歷整個鏈。Youtube Api,如何使用nextPageToken解析所有vids?

`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。

如何做?

+0

您不必計算你有多少個請求做出。當你收到一個有'nextPageToken'的響應時,你將它設置爲你的下一個請求的'pageToken'的值。然後重複這個過程(例如在'while循環中),總是使用最近的'nextPageToken',直到得到一個沒有設置'nextPageToken'的響應。然後你在搜索結果的末尾。 – paolo

+0

嗨,我正在考慮我將通過循環做什麼,並檢查來自服務器的最後一個回覆是否包含'nextPageToken'的內容,但問題在於我無法執行請求,即查詢鏈將等待響應,並且在應答之後將使用新參數執行... – CHBS

回答

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);