[英]Node.js - how to call a Facebook API within a for loop without exceeding rate limit?
[英]How can I make 3 thousand requests to Google Drive API using node.js without exceeding User Rate Limit?
我正在幫助一位有以下問題的朋友。
他希望谷歌硬盤中有3000個文件夾。 對於他們中的每一個,他將生成指向其URL的QR碼。 他會在每個文件夾中填寫一張照片,人們會把自己帶到一個活動上,然后人們會帶上一張小卡片,上面印有文件夾的二維碼,這樣他們就可以看到照片回家了。
我使用google的官方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代碼,文件夾沒有被正確命名。
誰能指出我正確的方向? 非常感謝
這應該對你有用,它會在之前的解決后觸發下一個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
});
如果這仍然太快,你可以在setTimeout中包裝resolve
setTimeout(function() {
resolve();
}, 1000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.