2017-02-18 3 views
1

Я помогаю другу, у которого есть следующая проблема.Как я могу сделать 3 тысячи запросов API Google Диска, используя node.js, не превышая ограничение скорости пользователя?

Он хочет иметь 3000 папок на Google Диске. Для каждого из них он будет генерировать QR-код, указывающий на их URL-адрес. Он заполнит каждую папку фотографией, которую люди возьмут на себя, и люди затем возьмут домой небольшую карту с QR-кодом их папки, напечатанной на нем, чтобы они могли видеть фотографию дома.

Я сделал небольшую программу nodejs, используя официальный клиент nodejs google, и отлично работает для одной папки. Вот код:

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 кодов, и папки не были правильно названы.

Может ли кто-нибудь указать мне правильное направление? Большое спасибо

ответ

0

Это должно сработать для вас, оно убьет следующее обещание после того, как предыдущий разрешится.

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); 
Смежные вопросы