2017-02-18 11 views
1

私は次の問題を抱えている友人を助けています。ユーザーレート制限を超えずにnode.jsを使用してGoogle Drive APIに3千のリクエストを送信するにはどうすればよいですか?

Googleドライブに3000個のフォルダが必要です。それらのそれぞれについて、彼はURLを指し示すQRコードを生成するでしょう。彼は各フォルダーに記入し、人々はイベントに参加し、フォルダーにQRコードが印刷された小さなカードを家に持ち込み、フォトホームを見ることができます。

Googleの公式のnodejsクライアントを使用して小さなnodejsプログラムを作成しました。これは1つのフォルダに対して完全に機能します。コードは次のとおりです。

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(function() { 
    resolve(); 
}, 1000); 
のsetTimeout

に決意をラップすることができます
関連する問題