使用createUserWithEmailAndPassword时添加displayName

时间:2016-05-24 12:08:00

标签: javascript firebase

我想将显示名称添加到刚创建的用户。但是当我创建UserUithWithEmailAndPassword时,我的currentUser为null。怎么了?

var name = document.getElementById("name").value;
var username = document.getElementById("username").value;
var email = document.getElementById('email').value;
var password = document.getElementById('password').value;
  // Sign in with email and pass.
  // [START createwithemail]
  firebase.auth().createUserWithEmailAndPassword(email, password).catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // [START_EXCLUDE]
    if (errorCode == 'auth/weak-password') {
      alert('The password is too weak.');
    } else {
      console.error(error);
    }
    // [END_EXCLUDE]
  });
  // [END createwithemail]
  var user = firebase.auth().currentUser;
  user.updateProfile({
      displayName: username
    }).then(function() {
      // Update successful.
    }, function(error) {
      // An error happened.
  });
document.getElementById("submitButton").innerHTML = "Loading...";
$("#submitButton").css("background-color", "#efefef");
$("#submitButton").css("cursor", "init");
$("#submitButton").css("color", "#aaa");
registerUserToDB(username, name, email);
console.log("shouldhave worked");

2 个答案:

答案 0 :(得分:24)

createUserWithEmailAndPassword是一个异步调用,就像Firebase中的几乎所有其他函数一样。您创建用户(最有可能成功),但在您尝试抓住currentUser后立即创建。几乎在每种情况下,您都会尝试在Firebase创建用户之前获取currentUser

重写内部回调:

firebase.auth().createUserWithEmailAndPassword(email, password).then(function(user) {
    // [END createwithemail]
    // callSomeFunction(); Optional
    // var user = firebase.auth().currentUser;
    user.updateProfile({
        displayName: username
    }).then(function() {
        // Update successful.
    }, function(error) {
        // An error happened.
    });        
}, function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // [START_EXCLUDE]
    if (errorCode == 'auth/weak-password') {
        alert('The password is too weak.');
    } else {
        console.error(error);
    }
    // [END_EXCLUDE]
});
成功时将调用

.then,并在出错时调用function(error)。您希望在用户创建成功后设置用户。

有些人不喜欢嵌套的回调,所以你可以创建一个获取当前用户的函数,并在成功时调用该函数。

文档:

Firebase Promises

Async, callbacks

答案 1 :(得分:1)

你必须这样做。

import {AngularFireAuth} from '@angular/fire/auth';
import { auth } from 'firebase';

constructor(private auth: AngularFireAuth) {}

signup(username: string, email: string, password: string) {
  this.auth.auth.createUserWithEmailAndPassword(email, password)
  .then((user: auth.UserCredential) => {
    user.user.updateProfile({
      displayName: username
    });
  })
}

如果你使用 Angular,那么你可以使用依赖注入将 AUTH 实例注入到构造函数中,然后你访问 AUTH 服务(this.auth.Auth),并使用 createUserWithEmailAndPassword() 方法创建你的帐户。账户创建成功后,返回Promise。由于它包含在 Promise 中,因此您必须使用 async、await 或 then() 来访问 UserCredential 类型的值。 UserCredential 的界面如下。

UserCredential: { additionalUserInfo?: AdditionalUserInfo | null; credential: AuthCredential | null; operationType?: string | null; user: User | null }

如您所见,UserCredential 实例中有许多属性,其中之一是 USER(用户:User | null)。该属性包含用户的所有信息。现在您可以访问 firebase.User 的方法。负责更新用户配置文件的方法是 updateProfile()。它具有 displayName、PhotoURL 属性。现在您可以像这样更新 userProfile。 user.user.updateProfile({ displayName: NAME })。请记住,您必须更新括号 ( {} ) 内的属性,因为 updateProfile 支持 JavaScript 对象参数。这个对象有两个属性,分别是 displayName 和 photoURL。

updateProfile ( profile :  { displayName ?: string | null ; photoURL ?: string | null } ) : Promise < void >

https://firebase.google.com/docs/reference/js/firebase.auth.Auth https://firebase.google.com/docs/reference/js/firebase.auth#usercredential https://firebase.google.com/docs/auth/web/password-auth#create_a_password-based_account https://firebase.google.com/docs/reference/js/firebase.User#updateprofile