反应原生 firebase 创建用户,然后将其他数据添加到实时数据库

Posted

技术标签:

【中文标题】反应原生 firebase 创建用户,然后将其他数据添加到实时数据库【英文标题】:React native firebase creating user then adding additional data to realtime database 【发布时间】:2018-04-28 10:53:49 【问题描述】:

我正在创建一个允许用户自己注册的应用程序。

使用 react-native 和 firebase 工作,注册并登录。甚至附加数据也存储在实时数据库中(我检查过)。 但是我收到一条消息说“创建用户失败”(这是我设置的消息之一)。

这是我用来创建用户并向实时数据库添加额外数据的代码:

firebase.auth().createUserWithEmailAndPassword(email, password)
    .then((user) => 
        firebase.database().ref('users/' + user.uid).set(
            firstName: firstName,
            lastName: lastName,
            email: email,
            code: code
        )
    )
    .then(user => loginUserSuccess(dispatch, user))
    .catch((error) => 
        createUserFail(dispatch)
        console.log(error);
    );

我还检查了android studio中的调试器(还不知道ios),看到如下评论:

TypeError: undefined is not an object (evaluating 'user.uid')

仍然保存了所有内容,但显示了错误消息。我做错了什么?

【问题讨论】:

你用的是什么库? 看起来问题出在user.uid 附近,你能不能用console.log 和console.log firebase.database().ref('users/' + user.uid) 看看你得到了什么。 会尽力回复您 @mjwatts 我尝试了 console.log,第一个是记录 user.uid,我明白了。第二个是 url:urltofirebase/users/the 与第一个 console.log 相同的 uid。我将 console.logs 放在了第一个然后就在 firebase 之前。 【参考方案1】:

我知道这已经有一年了,但我遇到了同样的问题,对于遇到同样问题的人来说,这里有一个更直接的解决方案。创建用户时,用户对象是 Firebase 响应的一部分,而不是响应本身。因此,只需将“res”添加到您的原始代码中,如下所示:

firebase.auth().createUserWithEmailAndPassword(email, password)
.then((res) => 
    firebase.database().ref('users/' + res.user.uid).set(
        firstName: firstName,
        lastName: lastName,
        email: email,
        code: code
    )
)

【讨论】:

【参考方案2】:

好的,我终于搞定了。我所做的是,在第一次之后,检查当前用户(因为用户将自动登录),然后获取 uid 并使用它:

if (firebase.auth().currentUser) 
    userId = firebase.auth().currentUser.uid;
    if (userId) 
        firebase.database().ref('users/' + userId).set(
            firstName: firstName,
            lastName: lastName,
            email: email,
            code: code
        )
    

这行得通。

【讨论】:

【参考方案3】:
firebase.auth().createUserWithEmailAndPassword(email, password).then((user)=>
    if (firebase.auth().currentUser) 
      userId = firebase.auth().currentUser.uid;
      if (userId) 
          firebase.database().ref('users/' + userId).set(
            firstname:firstname,
            lastname:lastname,
            email:email,
            password:password,
            town:town,
            addInterest:addInterest,
            photoUrl:false,
            emailVerified:false,
            uid:userId,
            status:true,
            online:true
          )
      
    
  ).catch(function(error) 
    // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;
      console.log('Register!');
      console.log(error);
  )

完整代码非常易于使用。 100% 工作!

【讨论】:

请始终将您的答案放在上下文中,而不仅仅是粘贴代码。有关详细信息,请参阅here。【参考方案4】:

你没有说你是否在动作创建者的上下文中使用它,但如果你这样做了,这是另一种可能的解决方案。让我们让它更有趣,它是一个添加新员工的应用程序:

export const employeeCreate = ( name, phone, shift ) => 
  const  currentUser  = firebase.auth();

  return () => 
    firebase
      .database()
      .ref(`/users/$currentUser.uid/employees`)
      // add a .then() to ensure after employee is created
      // we want to navigate them back to employee list screen
      .push( name, phone, shift )
      .then(() => Actions.pop());
  ;
;

Actions 将从 react-native-router-flux 导入,如下所示:

import firebase from 'firebase';
import  Actions  from 'react-native-router-flux';

【讨论】:

以上是关于反应原生 firebase 创建用户,然后将其他数据添加到实时数据库的主要内容,如果未能解决你的问题,请参考以下文章

反应原生 Firebase 不保留用户信息

反应原生无法将图像上传到firebase

反应原生导航 onAuthStateChanged

更新来自其他组件的道具反应原生

为啥我的 firebase onAuthStateChanged() 触发多次? (反应原生)

反应原生 Firebase 消息点击通知