簡體   English   中英

如何在不超過用戶速率限制的情況下使用node.js向Google Drive API發出3千個請求?

[英]How can I make 3 thousand requests to Google Drive API using node.js without exceeding User Rate Limit?

我正在幫助一位有以下問題的朋友。

他希望谷歌硬盤中有3000個文件夾。 對於他們中的每一個,他將生成指向其URL的QR碼。 他會在每個文件夾中填寫一張照片,人們會把自己帶到一個活動上,然后人們會帶上一張小卡片,上面印有文件夾的二維碼,這樣他們就可以看到照片回家了。

我使用google的官方nodejs客戶端制作了一個小nodejs程序,它適用於一個文件夾。 這是代碼:

function listFiles(auth) {
  var fileMetadata = {
    'name' : "Folder",
    "mimeType" : "application/vnd.google-apps.folder"
  };
  var service = google.drive({version: 'v3', auth: auth});
    fileMetadata.name = "FOLDER"
      fileMetadata.name = "FOLDER"
      service.files.create({
        resource: fileMetadata,
        fields: "id, webViewLink, name"
        },function(err, file){
          if(err){
            console.log(err);
          }
          else{
            request("https://api.qrserver.com/v1/create-qr-code/?data="+file.webViewLink+"&size=256x256").pipe(fs.createWriteStream("qr"+file.name+".png"));
            console.log("Folder id: ", file.id, file.webViewLink);
            //datab.close();
          }
      });
}

現在,我對nodejs及其異步性質都很陌生。 我不知道如何使用相同的代碼來創建3000個文件夾。 我嘗試使用for循環,但后來我得到了使用率限制錯誤代碼(403)。 然后我使用了睡眠功能,但我仍然有一些403代碼,文件夾沒有被正確命名。

誰能指出我正確的方向? 非常感謝

這應該對你有用,它會在之前的解決后觸發下一個Promise。

function listFiles(auth, folder) {
    return new Promise(function (resolve, reject) {
        var fileMetadata = {
            'name' : folder,
            "mimeType" : "application/vnd.google-apps.folder"
        };
        var service = google.drive({version: 'v3', auth: auth});
        fileMetadata.name = 'FOLDER'
        service.files.create({
            resource: fileMetadata,
            fields: "id, webViewLink, name"
        },function(err, file){
            if(err){
                reject(err);
                console.log(err);
            }
            else{
                var response = request("https://api.qrserver.com/v1/create-qr-code/?data="+file.webViewLink+"&size=256x256");
                response.on('end', function () {
                    resolve();
                })
                response.pipe(fs.createWriteStream("qr"+file.name+".png"));
                console.log("Folder id: ", file.id, file.webViewLink);
                //datab.close();
            }
        });
    });

}

var folders = ['a', 'b','c'];
var promises = [];
folders.forEach(function (folder) {
    promises.push(function () {
        return listFiles(auth, folder);
    });
})
(new Promise(function (resolve, reject) {
    const final = promises.reduce(function (prevTask, current) {
        return prevTask.then(current).catch(reject);
    }, Promise.resolve());
    final.then(resolve).catch(reject);
})).then(function() {
    // all ok
}).catch(function (error) {
    // ups
});

如果這仍然太快,你可以在setTimeout中包裝resolve

setTimeout(function() {
    resolve();
}, 1000);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM