Javascript 如何在不超过用户速率限制的情况下,使用node.js向Google Drive API发出3000个请求?

Javascript 如何在不超过用户速率限制的情况下,使用node.js向Google Drive API发出3000个请求?,javascript,node.js,google-api-nodejs-client,Javascript,Node.js,Google Api Nodejs Client,我正在帮助一位有以下问题的朋友 他希望在谷歌硬盘上有3000个文件夹。对于他们中的每一个人,他都会生成一个指向他们URL的二维码。他会在每个文件夹中填入一张人们在活动中拍摄的照片,然后人们会带回家一张印有文件夹二维码的小卡片,这样他们就可以看到照片了 我使用谷歌官方的nodejs客户端制作了一个小的nodejs程序,它可以完美地用于一个文件夹。代码如下: function listFiles(auth) { var fileMetadata = { 'name' : "Folder"

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

他希望在谷歌硬盘上有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)。然后我使用了一个sleep函数,但是我仍然得到了一些403代码,并且文件夹的命名不正确


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

这应该对您有效,它将在上一个问题解决后触发下一个承诺

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中包装解析

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

这应该对你有用,它将在前一个问题解决后触发下一个承诺

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中包装解析

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