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

时间:2016-07-05 21:45:12

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

我一直在努力创建这个非常简单的网络应用,使用谷歌驱动 appDataFolder json 格式存储和读取其状态。但是, 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能够创建/更新/读取此配置?

检索部分我尝试首先获取app文件夹中的文件列表,按名称匹配配置文件,获取其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
};

2 个答案:

答案 0 :(得分:5)

经过大量的反复试验后,我终于开始工作了。我无法使用gapi.client.drive.files.update来工作,但它适用于gapi.client.request:

&#13;
&#13;
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
};
&#13;
&#13;
&#13;

上述所有方法都会返回一个承诺。依赖于lodash

答案 1 :(得分:2)

我已经创建了一个库来处理所有样板文件,并公开了一个非常简单,直接的API:https://github.com/adrianbota/gdrive-appdata