2017-02-18 1 views
1

J'aide un ami qui a le problème suivant.Comment puis-je effectuer 3 000 requêtes vers l'API Google Drive à l'aide de node.js sans dépasser la limite du nombre d'utilisateurs?

Il veut avoir 3000 dossiers dans google drive. Pour chacun d'entre eux, il générera un code QR pointant vers son URL. Il remplira chaque dossier avec une photo les gens se prendront sur un événement et les gens vont alors prendre une petite carte avec le code QR de leur dossier imprimé afin qu'ils puissent voir la photo à la maison.

J'ai créé un petit programme nodejs en utilisant le client nodejs officiel de google, et cela fonctionne parfaitement pour un dossier. Voici le code:

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

Maintenant, je suis assez nouveau pour nodejs et sa nature asynchrone. Je ne sais pas comment utiliser le même code, si possible, pour créer 3000 dossiers. J'ai essayé d'utiliser une boucle for, mais j'ai eu des codes d'erreur de limite d'utilisation (403). J'ai alors utilisé une fonction de sommeil, mais j'ai encore quelques codes 403 et les dossiers n'étaient pas nommés correctement.

Quelqu'un peut-il me diriger dans la bonne direction? Merci beaucoup

Répondre

0

Cela devrait fonctionner pour vous, il se déclenchera après la promesse après la résolution.

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

Si cela est encore trop vite, vous pouvez enveloppez détermination à setTimeout

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