WebHU - Programozási kérdések és válaszok

Sikertelen dokumentumtörlés esetén a Firebase Firestore igazat ad vissza

Van egy alkalmazásom, amely a Firebase Firestore-ját használja a kitartás érdekében. A Material's Snackbart használom az értesítésekhez. szolgálatomban áll..

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

Ahol az adatparaméter egyszerűen egy objektum, amely tartalmazza azt a táblát, amelyen a műveletet el szeretném végezni, és a törölni kívánt dokumentum azonosítóját.

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

És a komponensemben

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);
        });
    }
  }

Ez tökéletesen törli a dokumentumot, de a sikertelen eset tesztelésekor igazat ad vissza.

Például, ha az „xyz”-t bekódolom a .doc('xyz') metódusba. A válasz a next() metódusomat hívja meg, nem pedig a my catch().

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

A Firebase-dokumentumok hangsúlyozzák, hogy a beágyazott gyűjtemények törlés után is megmaradnak, de ettől eltekintve a dokumentumok törlésének alapvető funkciói egyszerűek, és nem adnak túl sok információt, csak

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

Mit hiányolok?

TIA


  • Előfordulhat, hogy a delete() mindig sikeresen megoldódik, függetlenül attól, hogy a dokumentum korábban létezett-e. Ebben az esetben ez csak azt mondaná, hogy biztos lehet benne, hogy a dokumentum jelenleg nem létezik, nem pedig abban, hogy korábban létezett, most pedig nem. Ha tudni szeretné, hogy korábban létezett, próbálkozzon egy olyan tranzakcióval, amely először lekéri a dokumentumot, ellenőrzi a létezését, majd törli. 11.11.2018
  • Köszönöm válaszát, Doug. Ennek van értelme. Jó lenne azonban tesztelni a sikertelen esetet, és azt hittem volna, hogy egy nem létező dokumentum törlése megtette volna. #felvilágosítást kérek afirebase-től. 11.11.2018
  • Ne próbálja ráerőltetni a hiba meghatározását az API-ra. Valódi hiba az az eset, amikor egy dokumentum létezik, és Ön kéri annak törlését, de ez nem történt meg. Ismét próbáljon meg egy tranzakciót annak biztosítására, hogy csak egy korábban létező dokumentumot töröljön, ha ez a tudás fontos Önnek. 11.11.2018
  • Neves. Egészségedre, Doug 11.11.2018
  • Én az ellenkező irányból jövök rá. Meg akarok győződni arról, hogy valami nem létezik, mielőtt új dokumentumot hozok létre (ami egy felhő függvényt is kivált a onCreate-on keresztül), ezért meghívom a delete()-t, függetlenül attól, hogy létezik-e korábban. Ez a beszélgetés tudatja velem, hogy működni fog. 02.09.2019
  • Ezt teszteltem, és egy nem létező docId-t és egy nem létező gyűjteménynevet használtam. delete() mindig hibaüzenet nélkül működik. 26.10.2020

Válaszok:


1

Jelenleg a delete nem sikertelen, ha nem létezik dokumentum. Ez bizonyos értelemben összeegyeztethetetlen a create-vel, amely nem működik, ha korábban létezik.

Úgy tűnik azonban, hogy ezt a funkciót tervezték/tervezték. A Java SDK-ban a delete átvehet egy Precondition objektumot:

  /**
   * 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());
  }

A Precondition-ban van egy segítő módszer:

  /**
   * 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);
  }

Vegye figyelembe, hogy ez nem nyilvános. A megjegyzés szerint nincs háttértámogatás. Csak a Firestore csapata ismeri a jelenlegi állapotát.

27.10.2019
  • Majdnem egy éve :p Köszönöm, Nikola és jól kiszúrták. 08.11.2019

  • 2

    létezik előfeltétel nekem működik

        const batch = db.batch();
        const toDeleteRef = db.collection("somecollection").doc("someid");
        const counterRef = db.collection("somecollection").doc("count");
        batch.delete(toDeleteRef, {exists:true});
        batch.set(counterRef, {value:firestore.FieldValue.increment(-1)}, {merge:true});
        await batch.commit();
    
    03.01.2021
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..