【问题标题】:Firebase Updating User Data With Custom Fields After Creating UserFirebase 在创建用户后使用自定义字段更新用户数据
【发布时间】:2020-02-18 22:18:47
【问题描述】:

我想更新新创建的用户数据。返回的 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
        }
    }
};

【问题讨论】:

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


    【解决方案1】:

    我了解参数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

    【讨论】:

    • 谢谢你的工作。我认为问题是我从创建用户返回,而不是得到响应并提取用户 ID。
    • 实际上,如果我不返回响应,我如何能够将用户 API 密钥返回给调用此函数的函数?请查看更新代码....如果您觉得这是单独的或太长而无法在此处回答,我也可以将其移至新问题
    • 我理解“用户 API 密钥”是指用户 uid。查看更新。
    • 谢谢,我还意识到传递 API 密钥时存在加密块,这就是为什么我无法传递它的原因。这一切都很完美!
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2019-08-01
    • 2017-03-09
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多