2017-11-24 4 views
1

Es gibt einen Firebase-Server-Side-Code (Firebase-Funktionen), der einen Benutzer erstellt, wenn die angegebene userId nicht vorhanden ist.uid-already-exist-Fehler beim Erstellen eines nicht vorhandenen Benutzers

Es funktioniert normalerweise gut, aber selten schlägt fehl.

function createUserIfNotExist(userId, userName) { 
    admin.auth().getUser(userId).then(function (userRecord) { 
     return userRecord; 
    }).catch(function (error) { 
     return admin.auth().createUser({ 
      uid: userId, 
      displayName: userName, 
     }) 
    }) 
} 

Wenn gegeben userId nicht existiert, admin.auth(). GetUser() throws

{ code: 'auth/user-not-found', message: 'There is no user record corresponding to the provided identifier.' } 

So admin.auth(). Create() in catch-Klausel genannt. Aber es schlägt manchmal mit folgendem Fehler fehl

{ Error: The user with the provided uid already exists. 
    at FirebaseAuthError.Error (native) 
    at FirebaseAuthError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:39:28) 
    at new FirebaseAuthError (/user_code/node_modules/firebase-admin/lib/utils/error.js:104:23) 
    at Function.FirebaseAuthError.fromServerError (/user_code/node_modules/firebase-admin/lib/utils/error.js:128:16) 
    at /user_code/node_modules/firebase-admin/lib/auth/auth-api-request.js:399:45 
    at process._tickDomainCallback (internal/process/next_tick.js:135:7) 
    errorInfo: 
    { code: 'auth/uid-already-exists', 
    message: 'The user with the provided uid already exists.' } }  

Ist es Firebase-Fehler oder etwas ist falsch in meinem Code?

+0

Da UIDs ziemlich zufällig sind, wie erhalten Sie eine UID für einen Benutzer, der noch nicht existiert? I.e. Woher kommen diese Werte, wenn Sie 'createUserIfNotExist' aufrufen? –

+0

@FrankvanPuffelen die UIDs werden von 3rd Party Auth (Facebook Messenger-Plattform) generiert. Wir verwenden benutzerdefinierte Authentifizierung. – grayger

Antwort

1

Es scheint nicht viel von anderen documented reasons neben auth/internal-error warum der Anruf an getUser() würde scheitern zu sein, aber es wäre sicherer, ausdrücklich für auth/user-not-found zu überprüfen, bevor Schaffung eines neuen Benutzer auffordert:

function createUserIfNotExist(userId, userName) { 
    admin.auth().getUser(userId).then(function (userRecord) { 
     return userRecord; 
    }).catch(function (error) { 
     if (error.code === 'auth/user-not-found') { 
      return admin.auth().createUser({ 
       uid: userId, 
       displayName: userName, 
      }); 
     } else { 
      console.error("Error getting user data:", error); 
     } 
    }) 
} 
+0

Danke. Obwohl ich Ihre error.code Prüfung nicht eingeschlossen habe, ist sie immer 'auth/user-not-found', wenn sie in die catch-Klausel geworfen wird. – grayger

Verwandte Themen