我try 遵循这些文档,但它们没有提供如何使用该功能的工作示例.

这是我的实现:

async function transferOwner( ){
  const authClient = await authorize();
  const realFileId = '***fileId***';
  const newOwnerEmail = '@gmail.com';
  try{


    const drive = google.drive({version: 'v3', auth: authClient});

    const res = await drive.permissions.update({
      fileId: realFileId,
      permissionId: '***permission id that i found somehow***',
      transferOwnership: true,
      sendNotificationEmail: true,
      email: newOwnerEmail,
      "resource": {
        "role": "owner"
      }
    });


    console.log(result);
    console.log(`transfered ownership to ${newOwnerEmail}`);
    return result;
  } catch (err){
    console.log(`could not transfer ownership to ${newOwnerEmail}`);
    console.log(err);
      throw err
  }
}

当我执行此代码时,状态代码为200,但我没有看到我的驱动器中有任何所有者发生更改.

我做错了什么?

如果需要,这就是res.尽管我不得不删除一大块响应,因为stackoverover并不容易发布这么多内容.

{ 标题:{100}, 状态:200, 状态文本:"OK", 请求:{ 响应URL:' https:www.googleapis.com/drive/v3/files/101/permissions/102? transferOwnership=真实发送通知邮箱=真实邮箱=103 ' }` 所有权转让给104

将 * 添加到我试图隐藏任何信息的地方.

我try 了多种方法来使用我的代码更改所有者,但都不起作用.

每次我收到成功消息和200状态代码时,但驱动器中没有反映任何内容.

推荐答案

问题和解决办法:

现阶段,消费者账户(gmai.com)文件所有者转移时,需要运行2个步骤.Ref当我之前使用以下脚本进行测试时,目标帐户收到了一封转移所有者的邮箱.

const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});

const res = await drive.permissions.create({
  fileId: fileId,
  sendNotificationEmail: true,
  supportsAllDrives: true,
  requestBody: {
    role: "writer",
    type: "user",
    pendingOwner: true,
    emailAddress: newOwnerEmail,
  },
});

现在,不幸的是,当我进行测试时,邮箱没有发送,而且pendingOwner的值也没有更改为true.它保持false.因此,我注意到无法使用上面的脚本转移所有者.我不确定这是当前规范还是错误.

幸运的是,我注意到当更新现有权限时,pendingOwner的值可以更改为true.这样,目标用户就可以接受所有者的转移.在这个答案中,作为当前的解决方案,我想提出一个用于实现此流程的示例脚本.

示例脚本:

示例脚本如下.

const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});

const res1 = await drive.permissions.list({
  fileId,
  supportsAllDrives: true,
  pageSize: 100,
  fields: "*",
});
const permission = res1.data.permissions.find(
  ({ emailAddress }) => emailAddress == newOwnerEmail
);
let permissionId = "";
if (permission) {
  permissionId = permission.id;
} else {
  const { data: { id } } = await drive.permissions.create({
    fileId: fileId,
    sendNotificationEmail: true,
    supportsAllDrives: true,
    requestBody: {
      role: "writer",
      type: "user",
      pendingOwner: true, // It seems that this cannot be used. This might be a bug.
      emailAddress: newOwnerEmail,
    },
  });
  permissionId = id;
}
const res2 = await drive.permissions.update({
  fileId,
  permissionId,
  supportsAllDrives: true,
  requestBody: {
    role: "writer",
    pendingOwner: true,
  },
});
console.log(res2.data);
  • 在此脚本中,首先检索权限并搜索目标帐户的权限ID.当找不到权限时,将创建新权限并检索权限ID.然后,通过使用权限ID更新权限来更新pendingOwner.通过该流程,当目标用户确认该文件的权限时,用户可以确认"接受所有权?"如下.当用户接受时,文件的所有者就会转移给用户.

enter image description here

注:

  • 作为此解决办法的一个重要点,当文件的权限更新时,似乎不会发送邮箱通知.因此,当您使用此解决方案并希望将其通知给用户时,需要发送邮箱并让用户接受所有者转移.请小心点.

参考资料:

Node.js相关问答推荐

聚合操作不返回任何具有mongoose模式的内容

使用NodeJS的DynamoDB中的BatchGetItem出现MultipleValidationError

类扩展值[object object]不是构造函数或null

Puppeteer 的 BrowserFetcher 发生了什么?

找不到 vue-template-compiler@2.6.14 的匹配版本 | Shopware 6.5 更新后的 node 问题

如何使用Stripe测试失败的收费?

未授权使用联合身份未授权用户角色从 Amplify graphQL 访问类型 Y 上的 X

找不到模块bcryptjs

NPM 错误:修复upstream 依赖冲突安装 NPM 包(云功能)

图像存储在后端文件夹中,但使用 multer 和 react.js 在前端找不到

Zod 模式中的self 数组

Mongodb 从文档中获取聚合结果中的特定属性

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

使用 Node.js 在 MongoDB 中搜索

在安装 tensorflow 时遇到问题

带有 node.js 和 express 的基本网络服务器,用于提供 html 文件和assets资源

Node.js 变量声明和范围

如何使用适用于 Node.js 的 AWS 开发工具包将 Amazon S3 中的所有对象从一个前缀复制/移动到另一个前缀

create-react-app,安装错误(找不到命令)

在 Jade 包含中使用变量