【问题标题】:Angularfire 2.1 - How to access auto-generated ID for users (or how to make my UID the first node for each user)Angularfire 2.1 - 如何访问自动生成的用户 ID(或如何让我的 UID 成为每个用户的第一个节点)
【发布时间】:2017-04-11 19:59:48
【问题描述】:

免责声明,我正在尝试自学发展。我正在使用 Ionic 1 和现在的 Firebase 3 构建一个混合移动应用程序,用于我的数据库和身份验证。

对于我的场景,简而言之,我正在尝试为当前登录的用户显示“朋友”列表。这是我拥有的当前数据结构(无论如何都是相关部分):

数据结构

我有一行代码可以返回我想要的:

var friends = $firebaseArray(ref.child('users').child('-KXcxMXkKs46Xv4-JUgW').child('friends'));

当然,这是行不通的,因为里面有一个不错的硬编码值。

因此,我研究了如何检索当前 UID,以便替换硬编码值。但是在运行以下代码之后,用户下的第一个节点不是 UID(它是其他一些自动生成的值,我真的不知道它是如何到达那里的)。 UID 实际上在 id 字段中。

var ref = firebase.database().ref();
authObj = $firebaseAuth();
var firebaseUser = authObj.$getAuth();
console.log(firebaseUser.uid);

所以,最终我希望能够更改数据结构,使 UID 成为用户下的第一个节点,但我似乎无法找到文档来做到这一点。我查看了另一个堆栈线程,但它是一个过时的版本,我似乎无法连接这些点。 Other thread

不过,如果我无法更改结构,我仍然需要弄清楚如何以一种或另一种方式访问​​当前用户的朋友节点。

提前谢谢你。这是我的第一篇 stackoverflow 帖子,所以要温柔。

更新: 根据 Frank 的评论,这是我为创建用户而执行的代码 - $add 是创建推送 id (-KXcxM...) 的代码。

createProfile: function(uid, user) {
    var profile = {
        id: uid,
        email: user.email,
        registered_in: Date()
        // a number of other things
    };

var messagesRef = $firebaseArray(firebase.database().ref().child("users"));
messagesRef.$add(profile);
},

register: function(user) {
    return auth.$createUserWithEmailAndPassword(user.email, user.password)
        .then(function(firebaseUser) {
            console.log("User created with uid: " + firebaseUser.uid);
            Auth.createProfile(firebaseUser.uid, user);
            Utils.alertshow("Success!","Your user has been registered.");
        })
        .catch(function(error) {
           Utils.alertshow("Error.","Some helpful error message.");
          console.log("Error: " + error);
        });
    }

【问题讨论】:

  • 这些随机的硬编码值是所谓的 push ID,当您在 $firebaseArray 上调用 Firebase 的 push() 方法或 $add() 时会生成这些值。因此,在您的代码中的某处,用户正在使用push()$add() 添加到数据库中。解决问题的第一步是找出像这样添加用户的代码。
  • 我用 $add 更新了我的帖子。在谷歌搜索之后,我仍然不太确定如何改变它以获得我想要的效果。想法?谢谢你的评论,顺便说一句。它确实给了我一个新的研究重点。
  • 使用此firebase.database().ref().child("users").child(uid).set(profile) 添加用户。 $firebaseArray() 将自动选择新用户。
  • 对不起,你能不能对我说得更直白一点,好吗?我不能只是复制/粘贴您的确切更改,因为它出于某种原因破坏了我的应用程序。我还包含了我的注册函数代码,该函数同时在此处调用,以防万一也需要更改。

标签: firebase firebase-realtime-database firebase-authentication angularfire


【解决方案1】:

您可以使用常规 Firebase JavaScript SDK 存储用户,而不是创建 $firebaseArray 并在其上调用 $add

createProfile: function(uid, user) {
    var profile = {
        id: uid,
        email: user.email
    };
    firebase.database().ref().child("users").child(uid).set(profile);
}

由于 AngularFire 是在 Firebase JavaScript SDK 之上构建的,因此两者可以很好地交互。因此,如果您在users 上有任何现有的$firebaseArray,它也会选择新的个人资料。

【讨论】:

  • 非常感谢您的耐心和帮助!对于我的学习...是否有一个特定的文档领域我可以进一步磨练,这样我就可以偶然避免这种情况/
  • 不幸的是,该主题(将 Firebase 身份验证用户配置文件存储在 Firebase 数据库中)在文档中未涵盖。我们曾经在old firebase.com docs here 中介绍过它。但现在最好的办法是在 Stack Overflow 上搜索 something like this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2013-03-14
相关资源
最近更新 更多