【问题标题】:Firestore long get requestFirestore 长获取请求
【发布时间】:2018-11-24 00:37:06
【问题描述】:

我正在使用 Firebase 和 ReactJS 创建一个使用 Firestore 的网站。当我使用以下 Javascript 代码从 Firestore 读取时,它是成功的,但是,在刷新页面后一分钟内会发生额外的 GET 请求。

firestore
  .collection("users")
  .doc(uid)
  .get()
  .then(doc => {
    if (!doc.exists) {
      console.error("User " + uid + " does not exist. Cannot retrieve document");
    } else {
      const { avatar, displayName } = doc.data();
      this.setState({ avatar: avatar, displayName: displayName });
    }
  })
  .catch(err => {
    console.error("Error getting document", err);
  });

如果我在最后一次 GET 之前刷新页面,我会在控制台中收到警告跨域请求被阻止。从 Firestore 获取数据我仍然没有遇到任何问题。

跨域请求被阻止:同源策略不允许读取位于https://firestore.googleapis.com/google.firestore.v1beta1.Firestore/Listen/channel?database=projects%2Fsword-pear%2Fdatabases%2F(default)&gsessionid=QbGcouT4k6BUq5C33CSi25Ih6UQR6QI2&VER=8&RID=rpc&SID=wLKF3u5yBNBdMKhPjNHJwQ&CI=0&AID=6&TYPE=xmlhttp&zx=7mjvphigpy5i&t=2 的远程资源。 (原因:CORS 请求没有成功)

我假设服务器仍在尝试在刷新之前将数据发送到原始网页,但我不知道为什么如果我在前几毫秒内获取数据,GET 会花费这么长时间。

【问题讨论】:

  • 我怀疑延迟的请求只是 Firestore 使用的协议的一部分,并且是它尝试保持连接活动的一部分,以便后续进行得更快。
  • 这对我来说很有意义。我希望这与其他人在其应用程序中的体验相似,但如果没有任何潜在问题,我可以忍受它

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

这听起来很符合预期。 Firestore 针对与后端的实时通信进行了优化,并通过使用涉及长期 GET 请求的长轮询形式来实现这一点。因此,即使您只调用get(),SDK 在内部也会启动到后端的长轮询连接,以防您执行后续的get()onSnapshot() 调用。我相信如果您在大约 1 分钟内不再执行任何请求,那么连接将被清理,除非您执行其他操作,否则您将不会再看到任何 GET 请求。

我无法准确解释为什么浏览器会在页面重新加载时记录“Cross-Origin Request Blocked”消息,但这应该是良性的,可以忽略。

【讨论】:

    【解决方案2】:

    一开始是localhost,然后是跨域GET 请求,这似乎超时了。从 Firebase Hosting 运行该脚本将使其成为合法的非跨域请求。问题在于混合了开发和实时环境,而不是使用在localhost 上运行的模拟器。

    之前更新 Google Cloud SDK(别名gcloud 命令)时,我看到了这个:

    Cloud Firestore Emulator
    ▪ Release Cloud Firestore Emulator version 1.2.1
      ◆ This is the first beta release of the emulator.
    

    这将是一种绕过跨域请求的方法,但不允许这样做。

    请参阅Web Origin Concept

    【讨论】:

    • 不幸的是,它在部署到 Firebase 时仍然会以这种方式运行。我最初确实认为这也是问题所在。但是,最初加载页面时,它不会显示警告。如果您在 60 秒内刷新,则会显示警告
    • @Acais 你试过在本地运行模拟器吗?问题是 HTML 无法发送 HTTP 标头以允许 CORS,而在纯 JS 中,仅 Internet Explorer 支持。无论何时显示错误消息,显示它的事实都暗示了跨域情况。
    猜你喜欢
    • 2020-08-20
    • 2021-05-02
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2019-08-10
    • 2018-01-09
    相关资源
    最近更新 更多