创建用户后,Firebase使用自定义字段更新用户数据

时间:2019-10-22 17:48:06

标签: json firebase react-native firebase-realtime-database firebase-authentication

我想更新新创建的用户数据。返回的JSON是:

{ 
"user":{ 
  "uid":"test123",
  "displayName":null,
  "photoURL":null,
  "email":"test12@test.com",
  "emailVerified":false,
  "phoneNumber":null,
  "isAnonymous":false,
  "tenantId":null,
  "providerData":[ 
     { 
        "uid":"test12@test.com",
        "displayName":null,
        "photoURL":null,
        "email":"test12@test.com",
        "phoneNumber":null,
        "providerId":"password"
     }
  ],
  "apiKey":"test123",
  "appName":"[DEFAULT]",
  "authDomain":"test123.firebaseapp.com",
  "stsTokenManager":{ 
     "apiKey":"test123",
     "refreshToken":"test123",
     "accessToken":"test123",
     "expirationTime":1571238989357
  },
  "redirectEventId":null,
  "lastLoginAt":"1571235389108",
  "createdAt":"1571235389108"
},
"credential":null,
"additionalUserInfo":{ 
  "providerId":"password",
  "isNewUser":true
},
"operationType":"signIn"
}

这是我的标注和更新:

createUser = async (userData) => {
  return await firebase.auth().createUserWithEmailAndPassword(userData.get('userName'), userData.get('password'))
  .then((authData) => {
    firebase.database().ref('users/' + authData.user.uid + '/').set({
       fullName: userData.get('fullName'),
       pictures: userData.get('pictures'),
       phoneNumber: userData.get('phoneNumber')

    });
  })
};

是否可以向用户表自定义字段添加内容?

一些事情正在发生。似乎在.then语句中看不到userData。因此,为了解决这个问题,我尝试将userData JSON作为参数传递。这没有用。然后,我从userData中分解出每个值,将其保存到const中并传递该值。这没有用。

我可以看到userData在.then语句之前包含值。我能够使用正确的用户名和密码成功创建一个新用户。这对我来说意味着:

A-我没有正确传递userData JSON或

B-不允许像我一样将数据传递到Firebase

我的最终目标是注册一个用户,然后从注册表单(也称为userData)中获取他们输入的所有数据,并使用该表单更新用户表。

我正在使用的文章是: https://firebase.google.com/docs/auth/web/manage-users https://medium.com/mindorks/firebase-realtime-database-with-react-native-5f357c6ee13b

调用createUser函数的主类:

const signUp  = (dispatch) => {
    return  async (userData)=>{
        try{
            const response = await config.createUser(userData);
            console.log('sign up resonse1: ' + response); //coming back as undefined
            //todo:: figure out how to parse out the apikey out of response
            await AsyncStorage.setItem('token', '123mockToken');  
            dispatch({type: 'sign_up', payload: '123mockToken'}); 
            navigate('mainFlow'); 
        } catch(e){
            dispatch({type: 'add_error', payload: '' + e}); //we call dispatch anytime we want to update our state
        }
    }
};

1 个答案:

答案 0 :(得分:3)

我知道参数userData包含您要用于创建用户的所有数据(“他们从注册表单中输入的所有数据”)。

以下方法应该起作用:

  createUser = async userData => {
    try {

      const userCredential = await firebase
        .auth()
        .createUserWithEmailAndPassword(
          userData.get('userName'),
          userData.get('password')
        );

      const userId = userCredential.user.uid;

      await firebase
        .database()
        .ref('users/' + userId + '/')
        .set({
          fullName: userData.get('fullName'),
          pictures: userData.get('pictures'),
          phoneNumber: userData.get('phoneNumber')
        });

      return userId;  //As per your comment below

    } catch (error) {
      return error;
    }
  };

createUserWithEmailAndPassword()方法返回一个UserCredential,其中包含一个User