Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对我的Google Drive API调用进行分级限制?_Javascript_Node.js_Google Drive Api_Rate Limiting_Google Api Nodejs Client - Fatal编程技术网

Javascript 如何对我的Google Drive API调用进行分级限制?

Javascript 如何对我的Google Drive API调用进行分级限制?,javascript,node.js,google-drive-api,rate-limiting,google-api-nodejs-client,Javascript,Node.js,Google Drive Api,Rate Limiting,Google Api Nodejs Client,我正在编写一个节点脚本,以下载与我在Google Drive上的帐户共享的所有图像 正如其他人发布的关于堆栈溢出的帖子一样,我遇到了麻烦: 指数退避对我来说很有意义,我只是不知道如何去实现它 我对这方面的任何见解都会非常有帮助。即使只是一个“开始…”也会很棒 我在下面添加了我正在研究的方法。授权,一切正常,只需接收userratelimited错误即可 任何和所有的帮助都将是非常棒的,非常感谢 谢谢大家! /** * Download all of the shared images. *

我正在编写一个节点脚本,以下载与我在Google Drive上的帐户共享的所有图像

正如其他人发布的关于堆栈溢出的帖子一样,我遇到了麻烦:

指数退避对我来说很有意义,我只是不知道如何去实现它

我对这方面的任何见解都会非常有帮助。即使只是一个“开始…”也会很棒

我在下面添加了我正在研究的方法。授权,一切正常,只需接收
userratelimited
错误即可

任何和所有的帮助都将是非常棒的,非常感谢

谢谢大家!

/**
 * Download all of the shared images.
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function downloadImages(auth) {
  const gDrive = google.drive({
    version: 'v3',
    auth: auth
  });

  gDrive.files.list({
    q: 'sharedWithMe = true and mimeType = "image/jpeg"'
  }, (err, resp) => {
    if(err) {
      console.log('The API returned an error: ' + err);
      return;
    }

    if(!resp.files.length) {
      console.error('No files found.');
    } else {
      // Remove existing images.
      // removeImages();

      _.each(resp.files, (file) => {
        if(fs.existsSync(IMAGE_DIR + file.name)) {
          return;
        }

        gDrive.files.get({
          fileId: file.id
        })
        .on('end', () => {
          console.log(chalk.green(file.name + ' successfully downloaded.'));
        })
        .on('error', (err) => {
          console.log(err);
        })
        .pipe(fs.createWriteStream(IMAGE_DIR + file.name));
      });
    }
  });
}

编辑:我研究了批处理,但我猜google api nodejs客户端不支持批处理。我尝试了一个叫做“Batchelor”的第三方lib。为了我的生命,我还是无法让它发挥作用(

这并不简单,特别是在像JavaScript这样的aync语言中。首先,正如我在回答您所引用的问题时所解释的,不要做指数退避。API调用之间会有巨大的延迟

您可以在中查看代码 这是一个Angular 1服务,处理GDrives的特性,包括403。它通过将请求放入内部队列来实现,然后我有一个进程,以可变速率将项目从队列中取出,以最大限度地提高吞吐量,同时最小化403和伴随的重试


批处理会让情况变得更糟,所以不要走这条路。限制因素不是http请求的速率,而是请求发送到GDrive内部系统的速率。一批请求快速连续地发送到GDrive,操作系统更有可能触发403。这并不简单,尤其是从像Ja这样的aync语言首先,不要做指数退避,正如我在回答你提到的问题时所解释的那样。API调用之间会有很大的延迟

您可以在中查看代码 这是一个Angular 1服务,处理GDrives的特性,包括403。它通过将请求放入内部队列来实现,然后我有一个进程,以可变速率将项目从队列中取出,以最大限度地提高吞吐量,同时最小化403和伴随的重试

批处理会让情况变得更糟,所以不要走这条路。限制因素不是http请求的速率,而是请求发送到GDrive内部系统的速率。一批请求快速连续地发送到GDrive,操作系统更有可能触发403。

基于此,
错误403
u您得到的错误表示已达到开发人员控制台的每用户限制

请注意,驱动器API有一个:

  • 每日限额100000000请求/天
  • 礼节性每日配额每秒100个请求

  • 每个用户限制10个请求/秒/用户
下面是驱动器API的默认配额的屏幕截图

因此,针对您的错误建议的操作是:

  • 提高开发人员控制台项目中的每用户配额。(使用此选项可请求更多配额)

  • > P>如果一个用户代表谷歌应用程序域的许多用户提出了很多请求,请考虑授权委托(设置)。
  • 使用

有关更多信息,请检查以下问题:

基于此,您得到的
错误403
UserRateLimitOvered
错误意味着已达到开发人员控制台的每用户限制

请注意,驱动器API有一个:

  • 每日限额100000000请求/天
  • 礼节性每日配额每秒100个请求

  • 每个用户限制10个请求/秒/用户
下面是驱动器API的默认配额的屏幕截图

因此,针对您的错误建议的操作是:

  • 提高开发人员控制台项目中的每用户配额。(使用此选项可请求更多配额)

  • > P>如果一个用户代表谷歌应用程序域的许多用户提出了很多请求,请考虑授权委托(设置)。
  • 使用

有关更多信息,请检查以下问题:


对于速率限制,您必须注意的是每秒每用户的速率

我使用了一个脚本,每1.3秒发送一批10个请求,该脚本运行良好

在13秒内发送一批100个请求,但中途会出现403个错误


因此,结论是:注意每秒,而不是每100秒的限制。

对于速率限制,您必须注意的是每用户每秒

我使用了一个脚本,每1.3秒发送一批10个请求,该脚本运行良好

在13秒内发送一批100个请求,但中途会出现403个错误


因此,结论是:注意每秒,而不是每100秒的限制。

当您受到速率限制时,
gDrive.fkiles.get()
do做什么?您是否在
.on('error',…)中遇到特定错误
您可以检测到的事件处理程序?如果是,那是什么具体的错误?基本上,如果您能帮助我们知道如何在您受到速率限制时检测,我们可以帮助代码来处理它。@jfriend00-它看起来甚至没有到达错误处理程序。它只会返回一个错误对象,上面写着“UserRateLimitExtered”或者别的什么。我说它没有到达错误处理程序,因为如果我执行类似于
console.error('error',error)
的操作,我将根本看不到我的日志标签。:(当您受到速率限制时,会看到什么<