【问题标题】:Enable offline persistence Cloud Firestore启用离线持久性 Cloud Firestore
【发布时间】:2021-05-10 13:26:21
【问题描述】:

我想使用 Cloud Firestore Javascript SDK 启用离线持久性。由于 SSR,我已将我的应用程序构建为将 Firestore 存储为属性的方式。

import firebase from "firebase/app";

export class GetFirebase {
private firestore: firebase.firestore.Firestore;
private firebaseApp: firebase.app.App;
private firebaseConfig = {} // has the config from firebase

 private constructor() {
  this.firebaseApp = firebase.initializeApp(this.firebaseConfig);
  this.firestore = firebase.firestore();
 }
}

如果我尝试使用 enablePersistence() 方法,我会得到一个 void。

  this.firestore = firebase.firestore().enablePersistence();

我也做不到

  this.firestore = firebase.firestore();
  this.firestore.enablePersistence() // error cannot change settings after firestore is initialized.

我正在从 Dart 寻找与 .. 级联运算符等效的 Typescript 或 Javascript,但找不到。

【问题讨论】:

  • 你好弗兰克,你在使用云功能吗?如果没有,你使用什么服务器?

标签: javascript typescript firebase google-cloud-firestore


【解决方案1】:

导致持久性调用返回 void 的原因有很多:

  1. 与离线数据不兼容的版本,有一些服务没有实现这个功能,比如 Node.js 我复制了你的案例,我发现它与 Node.js 不兼容所以验证你的服务器firebase enable offline是否兼容很重要。如果您打开多个选项卡也可能导致错误,一次只能在一个选项卡中启用持久性。 当前浏览器不支持启用持久性所需的所有资源。对于 Web,仅 Chrome、Safari 和 Firefox Web 浏览器支持脱机持久性。

  2. 您正在进行异步调用,发生这种情况是因为您正在做出承诺,因此第一次打印值结果是无效的,因为响应尚未到达。但是,当 Promise 收到信息时,它将不再是无效的。要了解有关如何工作的更多信息,请promise documentation

  3. 您没有处理承诺,这可能会导致问题。我做了一个复制,它引起了以下警告: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() firebase enable offline 处理的承诺。


    firebase.firestore().enablePersistence()
      .catch((err) => {
          if (err.code == 'failed-precondition') {
              // Multiple tabs open, persistence can only be enabled
              // in one tab at a a time.
              // ...
          } else if (err.code == 'unimplemented') {
              // The current browser does not support all of the
              // features required to enable persistence
              // ...
          }
      });
    // Subsequent queries will use persistence, if it was enabled successfully

  1. 您正在使用服务器端渲染,因此可能会导致错误修复此问题,您必须使用 process.browser 作为example process browser。我将此功能与 nextjs、node 和 vue 一起使用,并且可以正常工作。
    if (process.browser) {
      console.log('this code will only run on the browser')
    }

级联运算符 我建议你打开另一个线程来检查这个案例,因为它是另一个主题,以便更多人可以找到它。但是,我发现了一个博客,其中解释了如何将 cascade operator 转换为 JavaScript 。没有等价物,但有办法做到这一点。

【讨论】:

  • 感谢您的详细回答。我能够让它工作。事实证明我没有发现错误。新发布的 firebase v9 javascript SDK 似乎比之前的版本好很多。
猜你喜欢
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2019-03-06
  • 2020-06-29
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多