2013-07-28 2 views
8

Vielleicht sollte meine Frage neu formuliert werden: Wie korrigiere ich diese Verhaltensweisen in CRUD, worüber Firebase sich auszeichnet?Wie verwende ich Firebase, um automatische serverseitige Berechnungen zu verarbeiten?

Ich bekomme, dass CRUD gut funktioniert. Ich sehe auch, wie das Firebase-deklarative Sicherheitsmodell mir ermöglicht, die richtige Sicherheit serverseitig zu gewährleisten, wo es eigentlich sein sollte.

Sagen wir, ich habe einen Abonnement-Service. Jedes Mal, wenn sich eine Person für eine Dienstleistung anmeldet, muss automatisch eine "fällige" Werbebuchung zu ihrem Konto hinzugefügt werden. In einfachen Worten:

/users/john 
/services/goodstuff 

Also für goodstuff anmelden john kann, könnte ich ihn für 30 Tage eingelassen, ohne zu bezahlen, aber wird ihn daran erinnern, wenn 30 Tage ist, „Hey, Sie müssen Sie zahlen oder sonst verlieren Sie Ihr Abonnement für Goodstuff. "

Mit einem Server-Back-End, das würde ich POST-/services/goodstuff/members, zum Beispiel haben einen Teil des POST Handler hinzufügt eine Position zu john ‚s Konto„Sie schulden“, um sicherzustellen, dass niemand goodstuff ohne als beitreten kann markiert werden geschuldet.

In einer Firebase BaaS-App, in der diese serverseitigen Logiken nicht existieren, wie würde ich die App umgestalten, um das gleiche effektive Verhalten zu erhalten?

Antwort

6

Update (10. März 2017): Während die Architektur ich unten umreißen noch gültig ist und verwendet werden kann Firebase mit einer bestehenden Infrastruktur zu kombinieren, Firebase nur Cloud Functions for Firebase veröffentlicht, die Sie JavaScript-Funktionen auf Google laufen zu lassen Server als Reaktion auf Firebase-Ereignisse (z. B. Datenbankänderungen, angemeldete Benutzer und vieles mehr).

Eine mögliche Lösung (ungetestet, sorry, aber es sollte die richtige Idee sein): dass dies

{ 
    "rules": { 
    "users": { 
     "$user": { 
     /* When they create their user record, they must write a 'due' that's 
     * within the next 30 days. */ 
     ".write": "!data.exists() && newData.child('due').isNumber() && newData.child('due').val() < now + (30*24*60*60*1000)" 
     } 
    }, 
    "services": 
     "$service": { 
     /* Must be authenticated and due date must not be passed. */ 
     ".read": "auth != null && now < root.child('users/' + auth.id + '/due).val()" 
     } 
    } 
    } 
} 

verlangen, wenn jemand zum ersten Mal einloggt und initialisiert ihre Benutzer/Eintrag, sie‘ d muss ein Fälligkeitsdatum in den nächsten 30 Tagen schreiben. Und dann, wenn auf einen Dienst zugegriffen wird, würde dieses Fälligkeitsdatum als nicht bestanden bestätigt werden.

Eine andere Möglichkeit besteht darin, einen kleinen Back-End-Dienst zu entwickeln, um diese Art von Geschäftslogik zu verarbeiten. Firebase zeichnet sich durch das Schützen, Speichern und Synchronisieren von Daten aus. Aber wenn Sie eine komplizierte Geschäftslogik haben, sollten Sie darüber nachdenken, einen kleinen Back-End-Prozess in Gang zu setzen. Firebase hat einen REST api sowie Node.JS und JVM Clients, so dass es sehr einfach ist, einen eigenen Backend-Code zu verwenden, der in Firebase integriert ist.

+1

Oh, das ist sehr elegant. Anstatt den Server berechnen zu lassen, was hinzugefügt und hinzugefügt werden soll, sagen Sie: "Lassen Sie den Client es berechnen, aber erzwingen, dass es nur eine Antwort haben kann." Das ist wirklich sehr elegant, ich mag es. – deitch

+0

Persönlich würde ich nicht die Nummer "30 * 24 * 60 * 60 * 1000" in den Sicherheitsregeln setzen, eher abstrakt als Teil der Daten über Root abgerufen, aber das ist wirklich nett. – deitch