Sådan skrives smukke Node.js API'er ved hjælp af async / venter og Firebase-databasen

Denne tutorial vil dække de typiske brugstilfælde, du vil støde på, når du skriver RESTful API-slutpunkter for at læse og skrive til en Firebase-database-instans.

Der vil være fokus på smuk asynkron kode, der gør brug af funktionen async / vente i Node.js (tilgængelig i v7.6 og nyere).

(Du er velkommen til at smile søde, mens du vinker farvel til callback helvede )

Forudsætninger

Jeg antager, at du allerede har en Node.js-applikation konfigureret med Firebase Admin SDK. Hvis ikke, så tjek den officielle installationsvejledning.

Skrivning af data

Lad os først starte med at oprette et eksempel på POST-slutpunkt, der gemmer ord i vores Firebase Database-forekomst:

Dette er et meget grundlæggende slutpunkt, der tager en bruger-ID og en ordværdi og derefter gemmer det givne ord i en ordsamling. Enkelt nok.

Men der er noget galt. Vi mangler fejlhåndtering! I eksemplet ovenfor returnerer vi en 201-statuskode (hvilket betyder, at ressourcen blev oprettet), selvom ordet ikke blev gemt korrekt i vores Firebase-database-forekomst.

Så lad os tilføje nogle fejlhåndtering:

Nu hvor endepunktet returnerer nøjagtige statuskoder, kan klienten vise en relevant meddelelse til brugeren. For eksempel "Ord gemt med succes." Eller "Kan ikke gemme ord, klik her for at prøve igen."

Bemærk: Hvis nogle af ES2015 + -syntaksen ser ud ukendt for dig, så tjek Babel ES2015-guiden.

Læsning af data

OK, nu hvor vi har skrevet nogle data til vores Firebase-database, så lad os prøve at læse fra dem.

Lad os først se, hvordan et GET-slutpoint ser ud ved hjælp af den originale løftebaserede metode:

Igen, enkel nok. Lad os sammenligne det med en async / afvent version af den samme kode:

Bemærk det async-nøgleord, der er tilføjet før funktionsparametrene (req, res), og det afventede nøgleord, der nu går foran erklæringen db.ref ().

Metoden db.ref () returnerer et løfte, hvilket betyder, at vi kan bruge det afventede nøgleord til at "pause" udførelse af scriptet. (Det afventede nøgleord kan bruges med ethvert løfte).

Den endelige res.send () -metode køres først, når db.ref () -loftet er opfyldt.

Det er alt sammen godt og godt, men den rigtige skønhed ved asynk / afventning fremgår, når du har brug for at kæde flere asynkrone anmodninger.

Lad os sige, at du skulle køre et antal asynkrone funktioner i rækkefølge:

Ikke pænt. Dette er også kendt som ”dødspyramiden” (og vi har ikke engang tilføjet fejlhåndterere endnu).

Se nu på ovenstående uddrag, der er omskrevet for at bruge async / afvente:

Ikke mere dødspyramide! Derudover kan alle afventede udsagn indpakkes i en enkelt prøve / fangstblok for at håndtere eventuelle fejl:

Parallelt async / afventer anmodninger

Hvad med tilfælde, hvor du har brug for at hente flere poster fra din Firebase-database på samme tid?

Let. Brug bare Promise.all () -metoden til at køre Firebase-databaseanmodninger parallelt:

En ting mere

Når du opretter et slutpunkt for at returnere data hentet fra en Firebase Database-forekomst, skal du være forsigtig med ikke blot at returnere hele snapshot.val (). Dette kan forårsage et problem med JSON-parsing på klienten.

Sig f.eks., At din klient har følgende kode:

Snapshot.val (), der returneres af Firebase, kan enten være et JSON-objekt eller være null, hvis der ikke findes nogen poster. Hvis null returneres, kaster svaret.json () i ovenstående uddrag en fejl, da det forsøger at analysere en ikke-objekttype.

For at beskytte dig mod dette kan du bruge Object.assign () til altid at returnere et objekt til klienten:

Tak for at have læst!

Er du interesseret i at se et ægte projekt bygget oven på Firebase og Node.js? Tjek Vocabify, ordforrådsbyggeren, der hjælper dig med at huske de ord, du støder på.