首页 > 解决方案 > Google Drive API,更改 api - 共享文件缺少父字段

问题描述

我尝试从 GDrive 同步更改,所以我正在使用更改 api。当我将它与restrictToMyDrive=true.

但是当我尝试扩展它以跟踪共享文件restrictToMyDrive=false时,我遇到了一些主要缺点。我的结果不一致 - 该parents字段偶尔会丢失。

假设我们user A将该文件夹共享到user B

rootSharedFolder=> subFolder=> subSubFolder=>File

如果user B调用更改 API 的时间比较接近user A共享rootSharedFolder,则在 3/10 次中将收到一些没有该parents字段的内部文件夹。

即使尝试files.get在收到的更改项上使用 API,也会导致空parents字段。但是如果我等待一两分钟然后再次调用它,parents结果中确实存在该字段。

其他人遇到这个问题,也许有解决方法?

谢谢!

此行为仅在调用changes api接近其他用户与您共享项目的时间时发生

标签: google-drive-api

解决方案


由于两个因素,可能缺少父母字段:

  1. 传播延迟
  2. 权限不足,无法查看父母

在这两种情况下,您都会注意到相同的情况:parents缺少文件字段,起初无法判断您是哪种情况:

传播问题:

当您请求与不属于您的共享文件相关的一些文件详细信息时,可能会发生这种情况。

乍一看可能找不到它的相关父级,这是因为更改仍在文件系统上传播,这称为传播问题,它应该不会持续很长时间,应该可以通过以下方式识别和解决这种不便在权限更改后几分钟检索此字段数据。

无法访问父母:

在这种情况下,您可能可以访问某个文件,但不能访问它的父文件夹,因此,您无法知道它的父文件夹,因为它没有与您共享。

这是在文档上:

  • 父母 - 如果请求用户不是共享驱动器的成员并且无权访问父母,则父母不会出现在父母列表中。此外,除了顶级文件夹之外,如果文件位于共享驱动器中,则父列表必须只包含一项。

旁注:您可能对使用 SharedDrives 感兴趣,其中文件由组织而不是个人用户拥有,从而简化共享过程并可能避免您在此处面临的问题。

https://developers.google.com/drive/api/v3/enable-shareddrives


如何知道是哪种情况?

一种方法是实现一个指数退避算法来尝试检索丢失的父母字段,如果在最大尝试次数后它没有检索到我们可能处于第二种情况:

exponentialBackoff(getParent, 7, 300, function(result) {
    console.log('the result is',result);
});

// A function that keeps trying, "getParent" until it returns true or has
// tried "max" number of times. First retry has a delay of "delay".
// "callback" is called upon success.

function exponentialBackoff(toTry, max, delay, callback) {
    console.log('max',max,'next delay',delay);
    var result = toTry();
    
    if (result) {
        callback(result);
    } else {
        if (max > 0) {
            setTimeout(function() {
                exponentialBackoff(toTry, --max, delay * 2, callback);
            }, delay);

        } else {
             console.log('we give up');   
        }
    }
}

function getParent() {
    var percentFail = 0.8;
    
    return Math.random() >= 0.8;
}


推荐阅读