【问题标题】:Loading Aurelia breaks Google API加载 Aurelia 会破坏 Google API
【发布时间】:2017-08-19 19:21:13
【问题描述】:

我在这里创建了这个错误的复制品(丑陋地使用了 Aurelia,但为了证明这一点):https://jberggren.github.io/GoogleAureliaBugReproduce/

如果我加载 Google API 并尝试在 Google Drive 中列出我的文件,我从 Googles quickstart 派生的代码可以正常工作。如果我在加载 Aurelia 后使用相同的代码,我会收到来自 gapi 的脚本错误说明

Uncaught Error: arrayForEach was called with a non array value at Object._.Sa (cb=gapi.loaded_0:382) at Object._.eb (cb=gapi.loaded_0:402) at MF (cb=gapi.loaded_0:723) at Object.HF (cb=gapi.loaded_0:722) at Object.list (cb=gapi.loaded_0:40) at listFiles (index.js:86) ...

在调试时,它似乎是某种数组检查(Chroms 说“本机代码”)在 Aurelia 加载后失败。在我寻找答案的过程中,我发现另外两个人有同样的问题但没有解决方案(Aurelia gitter questionSO Question)。不知道是否向 Aurelia 团队、Google 或实际问题所在的位置报告此问题。

帮帮我吧,你是我唯一的希望。

【问题讨论】:

  • 您可能想要更改演示 sn-p 的范围。不确定是否有太多 SO 贡献者愿意让您访问他们的云端硬盘帐户。尝试“drive.file”,它限制对您的应用创建的文件的访问。如果这阻碍了你,只需绕过 gapi 并制作你自己的 http rest/json 请求或使用aurelia.io/hub.html#/doc/article/aurelia/fetch-client/latest/…。您可以将 gapi 用于 OAuth 位,然后将访问令牌注入您的请求中,例如使用 httpClient.configure
  • 您好,感谢您的评论。我曾考虑过范围,因此原来的 drive.metadata.readonly 但我现在将其更改为 drive.file。这是一个 repo,我的实际项目正在使用另一个库来进行更简单的文件处理,该库在下面使用 gapi。从客户端获取/保存文件内容时,我发现 Google api 很难使用。我只是想保存一些 json(好吧,也许还有一些图像)。
  • 恕我直言,在开源之前使用 gapi 并不是一个好主意。我怀疑 gapi/aurelia/a polyfill 中的一个或另一个正在重载原型。 Google Drive REST API 并不难解决,如果您自己动手,您将更好地控制可恢复上传、部分下载、限制等。
  • 我快速浏览了您的代码。尽管与您当前的问题无关,但迭代对 files.list 的响应直到返回的数组为空并不是提取所有文件的正确方法。您应该迭代直到 nextPageToken 为空/未定义。这是因为 Drive 可以随时返回从零到 maxPageSize 的任意长度的页面。
  • 是的,正如我所说,谷歌 api 代码基于他们的快速入门,只是为了提供这个简单的重现,所以我不会实际使用。

标签: google-drive-api google-api-js-client aurelia


【解决方案1】:

这不是一个完美的解决方案,但有效。

aurelia 绑定

https://github.com/aurelia/binding/blob/master/src/array-observation.js

由于某些原因,Aurelia 会覆盖 Array.prototype.*

gapi(尤其是电子表格)

Gapi lib 检查以确保它是否是本机代码。

// example
const r = /\[native code\]/
r.test(Array.prototype.push)

结论

所以,我们必须进行猴子修补。

gapi.load('client:auth2', async () => {
  await gapi.client.init({
    clientId: CLIENT_ID,
    discoveryDocs: ['https://sheets.googleapis.com/$discovery/rest?version=v4'],
    scope: 'https://www.googleapis.com/auth/spreadsheets',
  });
  // monkey patch
  const originTest = RegExp.prototype.test;
  RegExp.prototype.test = function test(v) {
    if (typeof v === 'function' && v.toString().includes('__array_observer__.addChangeRecord')) {
      return true;
    }
    return originTest.apply(this, arguments);
  };
});

【讨论】:

  • 这个答案让我有点想不通,但是,嘿,它似乎有效!谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
相关资源
最近更新 更多