javascript - Hvordan gjøre et Firebase REST API-svar om til en array i TypeScript?


Jeg har for øyeblikket et problem med å behandle responsdata jeg har sendt til min Firebase Realtime Database ved bruk av REST i min Angular-app. For å innlede: Jeg skal være ærlig. Jeg lærer sakte både Angular og Firebase.

Jeg har en barnrute i databasen min kalt "pending-orders"

https://i.sstatic.net/ytwEs.png

Hver unik ID der samsvarer med den påloggede brukeren som gjorde innkjøpsordren på det tidspunktet.

For å hente alle mine ventende bestillinger sender jeg en GET HTTP-forespørsel til databasen min, der endepunktet er pending-orders.json akkurat som Firebase-dokumentasjonen foreslår.

Dette gir meg et svar som jeg antok skulle være et array. Men i stedet er det et objekt med nestede objekter. Jeg logget svaret, som er:

{G2v12VlKwNPXwtUDV4g41PIqHZx1: {…}, hYgflcf7WGR6wLrCPkAL1B4MbZI3: {…}}

Det jeg trenger derimot, er et array som inneholder barna (verdiene til nøklene i det svarobjektet). Jeg er ikke helt sikker på hvordan man får tak i ett. Hvordan går man frem for å få det til?

Som en bisetning...

Faktisk er jeg ikke engang sikker på hvordan jeg skulle gå frem for å hente ut en barne-node hvis unike ID er generert av Firebase selv (gjennom en POST-forespørsel).

Med mindre jeg hoppet over noe i dokumentasjonen for REST API-er, dekker de hvordan nylig innsatte underliggende noder får sin egen unike ID via POST-forespørsler, men senere diskuterer de ikke hvordan man spesielt får tilgang til disse underliggende nodene eller via samlinger (som jeg prøver å gjøre). Klienten har ingen måte å vite disse unike ID-ene (eller de tilpassede ID-ene jeg genererte selv), så vidt jeg vet.

Svar #1

Siden TypeScript bare er JavaScript, kan du gjøre ting som:

const pendingOrdersResponse = await firebase.handwaving.pendingOrders();
const pendingOrdersTransformed = Object.keys(pendingOrdersResponse).map(id => {
  return { uuid: id, ...pendingOrdersResponse[id] };
});

Da vil pendingOrdersTransformed være et array med dataene dine som vanlige JavaScript-objekter i arrayet og den genererte ID-en som uuid-feltet på hver pendingOrder i arrayet.

Svar #2

I tråd med Jay Codist sitt innlegg har jeg gjort følgende for å bygge min egen liste av ProcessedOrders basert på responsdataene jeg får fra Firebase. Løsningen jeg kom opp med er som følger:

fetchPurchaseOrders(): void {
this.http
  .get('https://APP-NAME.firebaseio.com/pending-orders.json')
  .subscribe((res) => {
    if (res) {
      const processedOrders: ProcessedOrder[] = [];
      for (const [key, value] of Object.entries(res)) {
        processedOrders.push(value as ProcessedOrder);
      }
      console.log(processedOrders);
    }
  });

}

Dette lar meg lagre ordrene uten å bry meg om den tilpassede ID-en jeg satte til hvert barnenode i databasen. console.log() der lar meg skrive ut alle ordrene slik jeg ønsket. Dette betyr at arrayen av ProcessedOrders nå kan brukes i appen slik jeg vil.

Jeg kan ikke la være å lure på om jeg kanskje har rotet til datastrukturen min ved å ikke tenke den gjennom skikkelig. Denne tilnærmingen vil være flott hvis jeg bare vil se bestillingene, men ikke så mye hvis jeg vil oppdatere informasjon om dem fra en administrativ side, siden jeg fortsatt må stole på den tilpassede ID-en jeg ga dem i utgangspunktet.

Jeg kan også ta meg tid til å lære AngularFire som andre kommentatorer har foreslått. Kanskje det vil være bedre og enklere å finne ut av enn REST API.

Uansett. Problemet har blitt løst, siden den opprinnelige hensikten med spørsmålet mitt var hvordan man kan gjøre et svar om til en matrise.

Takk til alle som prøver å hjelpe!

Relaterte artikler