【问题标题】:How can I make 3 thousand requests to Google Drive API using node.js without exceeding User Rate Limit?如何在不超过用户速率限制的情况下使用 node.js 向 Google Drive API 发出 3000 个请求?
【发布时间】:2017-07-08 05:01:49
【问题描述】:

我正在帮助有以下问题的朋友。

他想在谷歌驱动器中有 3000 个文件夹。他将为每个人生成一个指向其 URL 的二维码。他会在每个文件夹中填满一张人们会在活动中自拍的照片,然后人们会带回家一张小卡片,卡片上印有他们文件夹的二维码,这样他们就可以在家里看到照片。

我使用谷歌的官方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 代码,并且文件夹命名不正确。

谁能指出我正确的方向?非常感谢

【问题讨论】:

    标签: javascript node.js google-api-nodejs-client


    【解决方案1】:

    这应该对你有用,它会在解决上一个 Promise 后触发下一个 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
    });
    

    如果这仍然太快,您可以将 resolve 包裹在 setTimeout 中

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2021-05-27
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多