Jak psát krásné Node.js API pomocí async / await a Firebase Database

Tento tutoriál se bude zabývat typickými případy použití, se kterými se setkáte při psaní koncových bodů rozhraní RESTful API pro čtení a zápis do instance databáze Firebase.

Zaměří se na krásný asynchronní kód, který využívá funkci async / await v Node.js (k dispozici ve verzi 7.6 a vyšší).

(Neváhejte se sladce usmívat, když se máváte sbohem, abyste zavolali do pekla )

Předpoklady

Předpokládám, že již máte aplikaci Node.js nastavenou pomocí sady Firebase Admin SDK. Pokud ne, podívejte se na oficiálního průvodce nastavením.

Zápis dat

Nejprve vytvořme příklad koncového bodu POST, který uloží slova do naší instance databáze Firebase:

Toto je velmi základní koncový bod, který vezme userId a hodnotu slova, a poté dané slovo uloží do kolekce slov. Prostě jednoduché.

Ale něco je špatně. Chybí nám zpracování chyb! Ve výše uvedeném příkladu vracíme stavový kód 201 (což znamená, že zdroj byl vytvořen), i když slovo nebylo správně uloženo do naší instance databáze Firebase.

Přidejme tedy několik chybových řešení:

Nyní, když koncový bod vrací přesné stavové kódy, může klient zobrazit uživateli relevantní zprávu. Například „Slovo bylo úspěšně uloženo.“ Nebo „Nelze uložit slovo, klikněte sem a zkuste to znovu.“

Poznámka: Pokud vám některá syntaxe ES2015 + vypadá neznámá, podívejte se do průvodce Babel ES2015.

Čtení dat

Dobře, nyní, když jsme do naší databáze Firebase zapsali některá data, zkusme si z nich přečíst.

Nejprve se podívejme, jak vypadá koncový bod GET pomocí původní metody založené na slibu:

Opět, dost jednoduché. Nyní to porovnejme s asynchronní / očekávanou verzí stejného kódu:

Všimněte si klíčového slova async přidaného před funkční parametry (req, res) a očekávaného klíčového slova, které nyní předchází příkazu db.ref ().

Metoda db.ref () vrací slib, což znamená, že můžeme použít čekané klíčové slovo k „pozastavení“ provádění skriptu. (Čekající klíčové slovo lze použít s jakýmkoli příslibem).

Konečná metoda res.send () bude spuštěna až po splnění slibu db.ref ().

To je vše v pořádku a dobré, ale skutečná krása asynchronizace / čekání se projeví, když potřebujete zřetězit více asynchronních požadavků.

Řekněme, že jste museli postupně spouštět řadu asynchronních funkcí:

Ne hezké. Toto je také známé jako „pyramida zkázy“ (a my jsme ještě nepřidali popisovače chyb).

Nyní se podívejte na výše uvedený zlomek přepsaný pro použití asynchronního / čekajícího:

Už žádná pyramida zkázy! A co víc, všechny očekávané příkazy lze zabalit do jediného bloku try / catch, aby se vyřešily případné chyby:

Paralelní asynchronní / čekající žádosti

A co případy, kdy potřebujete načíst více záznamů z databáze Firebase současně?

Snadný. Stačí použít metodu Promise.all () k paralelnímu spuštění požadavků databáze Firebase:

Ještě jedna věc

Při vytváření koncového bodu pro vrácení dat načtených z instance databáze Firebase buďte opatrní, abyste jednoduše nevrátili celý snapshot.val (). To může způsobit problém s analýzou JSON na klientovi.

Řekněme například, že váš klient má následující kód:

Snímek snapshot.val () vrácený Firebase může být buď objekt JSON, nebo nulový, pokud neexistuje žádný záznam. Pokud je vrácena hodnota null, response.json () ve výše uvedeném fragmentu vyvolá chybu, protože se pokouší analyzovat typ objektu bez objektu.

Abyste se před tím chránili, můžete pomocí Object.assign () vždy vrátit klientovi objekt:

Děkuji za přečtení!

Máte zájem vidět projekt skutečného světa postavený na Firebase a Node.js? Podívejte se na Vocabify, tvůrce slovní zásoby, který vám pomůže zapamatovat si slova, na která narazíte.