首页 > 解决方案 > Firebase Firestore 在文档删除失败时返回 true

问题描述

我有一个使用 Firebase 的 Firestore 进行持久性的应用程序。我正在使用 Material 的 Snackbar 进行通知。我有我的服务..

deleteProvider(data) {
    return this.db.collection(data.table).doc('xzc').delete();
  }

其中数据参数只是一个对象,其中包含我要对其执行操作的表和我要删除的文档的 ID。

data: { table: 'providers', id: 'some firebase identifier'}

在我的组件中

onDeleteEntry(event) {
    if (event.table === 'providers') {
      this.providerService.deleteProvider(event)
        .then(() => {
          this.snackBar.open('Provider deleted');
        })
        .catch((error) => {
          this.snackBar.open('Error deleting provider', error);
        });
    }
  }

这会完美地删除文档,但在测试失败的情况下,它会返回 true。

例如,如果我将 'xyz' 硬编码到 .doc('xyz') 方法中。响应调用我的 next() 方法,而不是我的 catch()。

deleteProvider(data) {
    return this.db.collection(data.table).doc('xyz').delete();
  } // returns true on a non-existent document

Firebase 文档强调嵌套集合在删除后仍将保留这一事实,但除此之外,删除文档的基本功能很简单,除了

db.collection("cities").doc("DC").delete().then(function() {
    console.log("Document successfully deleted!");
}).catch(function(error) {
    console.error("Error removing document: ", error);
});

我错过了什么?

TIA

标签: angulartypescriptfirebasegoogle-cloud-firestore

解决方案


目前,如果文档不存在,delete不会失败。在某种程度上,这与 不一致create,如果它事先存在,它确实会失败。

但是,看起来这个功能是/计划好的。在 Java SDK 中,delete可以取一个Precondition对象:

  /**
   * Deletes the document referred to by this DocumentReference.
   *
   * @param options Preconditions to enforce for this delete.
   * @return An ApiFuture that will be resolved when the delete completes.
   */
  @Nonnull
  public ApiFuture<WriteResult> delete(@Nonnull Precondition options) {
    WriteBatch writeBatch = firestore.batch();
    return extractFirst(writeBatch.delete(this, options).commit());
  }

Precondition中,有一个辅助方法:

  /**
   * Creates a Precondition that enforces that a document exists.
   *
   * @param exists Whether the document should exist.
   * @return A new Precondition
   */
  // TODO: Make public once backend supports verify.
  @Nonnull
  static Precondition exists(Boolean exists) {
    return new Precondition(exists, null);
  }

注意不是公开的。评论说它缺乏后端支持。只有 Firestore 团队知道它的当前状态。


推荐阅读