0

Frage Konto erstellen: Wenn ein Benutzerkonto erstellt wird, wie Cloud-Funktionen nutzen, um seine display zu speichern, um EchtzeitDB in Schritten Feuerbasiswie Cloud-Funktionen verwenden, um Benutzer-display zu sparen, wenn sie in Feuerbasis

Das Szenario:

  1. ich habe eine Anmeldeseite enthält email, password, displayName Felder, Benutzern zu ermöglichen, neues Konto erstellen in Feuerbasis

  2. Above Seite wird 1) Trigger createUserWithEmailAndPassword bis c reate das Benutzerkonto, 2) Speichern displayName Wert zu userProfile in Auth DB.

  3. In der Cloud-Funktion wird der folgende Code verwendet, damit die E-Mail-Adresse des neuen Benutzers im DB-Knoten users gespeichert werden kann.

exports.createProfile = functions.auth.user().onCreate(event => return admin.database().ref(`/users/${event.data.uid}`).update ({email: event.data.email})

  1. Ich wünsche displayName-users Knoten mit obigem Code zu speichern, aber es scheint nicht möglich, da es nicht im Zusammenhang mit dem event in onCreate ist.

Was soll ich tun? Es wird fies, wenn ich sowohl die Client- als auch die Cloud-Funktion brauche, um den Knoten users zu aktualisieren.

Mit freundlichen Grüßen, D

Antwort

0

Die documentation für Auth Ereignisse schlägt die display über event.data.displayName zugänglich ist. Wenn du ein anderes Verhalten siehst, ist es ein Fehler oder du machst etwas falsches, das du hier nicht erwähnst.

+0

Mein Problem ist, dass, wenn die Verwendung E-Mail & Passwort-Konto zu erstellen, gibt es keine Möglichkeit scheint in eine ‚Anzeige‘ zu übergeben, wenn Benutzer verwendet Oauth mit Facebook oder Google, die ‚Wähle‘ wird von Anbietern abgerufen und zugänglich. –

+1

Vielleicht könnten Sie versuchen, es direkt nach der Erstellung auf dem Client zu setzen, um zu sehen, ob es festgeschrieben wird, bevor die Funktion auslöst. https://stackoverflow.com/questions/39804867/how-to-add-displayname-with-email-password-authentication-in-firebase-android –

+0

Vielen Dank! Ihr Kommentar ähnelt dem unten vorgeschlagenen Dhruv. Ich denke, ich sollte Cloud-Funktionen für On-User-Creating-Event löschen und alles von Client-Seite aus tun. Der ursprüngliche Grund für die Verwendung der Cloud-Funktion ist, dass sie im Vergleich zum Client-Code 100% garantiert ist. –

0

Sie müssen firebase.User.updateProfile() Methode verwenden, um die displayName zu aktualisieren, sobald die firebase.auth().createUserWithEmailAndPassword(email, password) Methode abgeschlossen ist. So -.

firebase.auth().createUserWithEmailAndPassword(email, password).catch(function (error) { 

}).then(function (user) { 
     user.updateProfile({ 
      displayName: "Jane Q. User",//pass displayName from your signup form here 
      photoURL: "<image-url>"//you can pass this empty 
     }).then(function() { 
      //redirect to your post-registration page 
     }); 
}) 
+0

Ich habe das versucht und dachte, es wäre die Lösung. Es wird jedoch eine Race-Bedingung eingeführt. Beide 'functions.auth.user(). OnCreate' und' updateProfile' versuchen asynchron, "displayName" zu aktualisieren. Warum aktualisiert die Cloud die Funktion "displayName"? Denn wenn der Benutzer von einem Drittanbieter (google, facebook usw.) erstellt wird, wird "event.data.displayName" angegeben. –

+0

Es scheint mir, dass Client-Code, um alle Informationen für "Benutzer" -Knoten zu aktualisieren, eleganter ist als das Teilen zwischen Cloud-Funktionen und Client-Code. –

+1

Ja. In Ihrem Anwendungsfall werden Cloud-Funktionen versuchen, parallel auszuführen. Ich würde auch vorschlagen, mit reiner clientseitiger Logik zu gehen. Die clientseitigen APIs von Firebase wurden gut entworfen und können auf Promise basierende Mehrfachanrufe verarbeiten. –

Verwandte Themen