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