javascript - 使用 google drive appDataFolder 在客户端使用 javascript 存储应用程序状态

标签 javascript json google-drive-api client-side

我一直在尝试创建这个非常简单的网络应用程序,它使用 google drive appDataFolderjson 格式存储和读取其状态。但是,v3 drive api 的文档不包含有关如何轻松实现此目的的综合示例。

到目前为止,我能够授权加载google drive api,但我无法创建配置< strong>json 文件(如果不存在),或者更新它的内容或者读取(如果它存在)。

我正在调用的是:gapi.client.drive.files.get 检索配置 json,gapi.client.drive.files.create创建配置 json 和 gapi.client.drive.files.update 更新其内容。

我一直在尝试使用 javascript Blob 对象来表示我的文件及其内容,但没有任何效果。

鉴于我有像 { test: true } 这样的配置和文件名 my-app.json,我将如何调用 gapi .client.drive.files 能够创建/更新/读取此配置的 API?

retrieve 部分我尝试通过首先获取应用程序文件夹中的文件列表,按名称匹配配置文件,获取其 ID,然后再次请求该文件使用ID。但由于我无法创建该文件,我不确定它是否有效。

代码目前看起来像这样(重要的是要注意此代码已构建并在客户端浏览器中运行,而不是在服务器上运行):

var config = require('../config/google-drive-config');

var authorize = function (immediate) {
  return gapi.auth.authorize({
    'client_id': config.clientId,
    scope: config.scopes.join(' '),
    immediate: !!immediate
  });
};

var loadDriveAPI = function () {
  return gapi.client.load(
    config.apiName,
    config.apiVersion
  );
};

var loadAppDataFileId = function () {
  return gapi.client.drive.files
    .list({
      spaces: 'appDataFolder'
    })
    .then(function(response) {
      return _(response.files)
        .find({ name: config.appDataFile })
        .get('id')
        .value();
    });
};

var loadAppData = function (fileId) {
  return gapi.client.drive.files
    .get({
      'fileId': fileId
    });
};

var saveAppData = function (appData, fileId) {
  var resource = {
    'name': config.appDataFile,
    'parents': 'appDataFolder'
  };

  var media = {
    mimeType: 'application/json',
    body: new Blob([JSON.stringify(appData)], { type: 'application/json' })
  };

  if (fileId) {
    return gapi.client.drive.files
      .update({
        fileId: fileId,
        media: media
      });
  }

  return gapi.client.drive.files
    .create({
      resource: resource,
      media: media,
      fields: 'id'
    });
};

module.exports = {
  authorize: authorize,
  loadDriveAPI: loadDriveAPI,
  loadAppDataFileId: loadAppDataFileId,
  loadAppData: loadAppData,
  saveAppData: saveAppData
};

最佳答案

经过多次尝试和错误,我终于让它工作了。我无法让 gapi.client.drive.files.update 工作,但它与 gapi.client.request 一起工作:

var auth = function (immediate) {
  return gapi.auth.authorize({
    'client_id': 'YOUR CLIENT ID GOES HERE',
    // Permissions here can be more restrictive
    scope: 'https://www.googleapis.com/auth/drive',
    immediate: immediate
  });
};

var silentAuth = function () {
  return auth(true);
};

var popupAuth = function () {
  return auth(false);
};

var loadDriveAPI = function () {
  return global.gapi.client.load('drive', 'v3');
};

var getAppDataFile = function () {
  return gapi.client.drive.files
    .list({
      q: 'name="your-app-data-file-name.json"',
      spaces: 'appDataFolder',
      fields: 'files(id)'
    }).then(
      function (data) {
        if (_.isEmpty(data.result.files)) {
          throw "no files found";
        }

        return {
          fileId: data.result.files[0].id
        }
      }
    );
};

var createAppDataFile = function () {
  return gapi.client.drive.files
    .create({
      resource: {
        name: 'your-app-data-file-name.json',
        parents: ['appDataFolder']
      },
      fields: 'id'
    }).then(function (data) {
      return {
        fileId: data.result.id
      };
    });
};

var getAppDataFileContent = function (fileId) {
  return gapi.client.drive.files
    .get({
      fileId: fileId,
      // Download a file — files.get with alt=media file resource
      alt: 'media'
    }).then(function (data) {
      return {
        fileId: fileId,
        appData: data.result
      };
    });
};

var saveAppData = function (fileId, appData) {
  return gapi.client.request({
    path: '/upload/drive/v3/files/' + fileId,
    method: 'PATCH',
    params: {
      uploadType: 'media'
    },
    body: JSON.stringify(appData)
  });
};

module.exports = {
  silentAuth: silentAuth,
  popupAuth: popupAuth,
  loadDriveAPI: loadDriveAPI,
  getAppDataFile: getAppDataFile,
  createAppDataFile: createAppDataFile,
  getAppDataFileContent: getAppDataFileContent,
  saveAppData: saveAppData
};

以上所有方法都返回一个 promise 。对lodash有依赖

关于javascript - 使用 google drive appDataFolder 在客户端使用 javascript 存储应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213298/

相关文章:

powershell - Google Drive API - 具有域范围权限的服务帐户可以列出共享驱动器,但不能列出其内容

javascript - 如何获取没有子元素但可能有文本的元素?

JavaScript 闭包和作用域

ios - -[NSNull 长度] : unrecognized selector sent to JSON objects

python - 如何使用带有 Python 的 Google Drive API 覆盖文件?

c# - Google Drive - 如何从代码中清空垃圾(以编程方式)?

javascript - jQuery/JavaScript 在点击时增加值

javascript - jQuery SlideReveal 不会在加载时显示

mysql - MySQL 5.7 中带有部分路径的深度 JSON 查询?

php - 如何将对象数组从 javascript 传递到 PHP