如何使用Firebase按名称获取用户?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我正在尝试创建一个应用程序,在那里我可以在特定用户帐户中获取/设置数据,并且受到Firebase的诱惑。

我遇到的问题是,当我的结构如下所示时,我不知道如何针对特定的用户数据:

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912

我找不到任何关于如何访问单个数据的东西,更不用说当他们被赋予一些随机散列作为ID时。

我要如何根据他们的名字去获取个人用户的信息?如果有更好的方法,请告诉我!

提问于
用户回答回答于

在向Firebase写入数据时,你有几个不同的选项可以反映不同的用例。在较高层次上,Firebase是一个树形结构的NoSQL数据存储区,并提供了一些用于管理数据列表的简单基元:

  1. 使用独特的已知密钥写入 Firebase: ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
  2. 通过自动生成的密钥附加到列表,该密钥将按照时间自动排序: ref.child('users').push({ "first_name": "rob", "age": 28 })
  3. 通过其独特的已知路径来监听数据的变化: ref.child('users').child('123').on('value', function(snapshot) { ... })
  4. 按键属性值过滤排序列表中的数据: // Get the last 10 users, ordered by key ref.child('users').orderByKey().limitToLast(10).on('child_added', ...) // Get all users whose age is >= 25 ref.child('users').orderByChild('age').startAt(25).on('child_added', ...)

除此之外orderByChild(),你不再需要为子属性查询创建自己的索引!例如,要检索名称为“Alex”的所有用户:

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added',  ...)

在Firebase中编写数据时,可以set使用唯一的定义路径(即a/b/c)或push数据将数据导入列表,这将生成唯一的ID(即a/b/<unique-id>),并允许你按时间对列表中的项目进行排序和查询。你在上面看到的唯一ID是通过调用push将项添加到列表中生成的online-b-cards/users

push我建议不要在这里使用set,而是使用唯一密钥(例如用户的电子邮件地址)为每个用户存储数据。然后,您可以online-b-cards/users/<email>通过Firebase JS SDK 导航访问用户的数据。例如:

function escapeEmailAddress(email) {
  if (!email) return false

  // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address)
  email = email.toLowerCase();
  email = email.replace(/\./g, ',');
  return email;
}

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users');
var myUser = usersRef.child(escapeEmailAddress('hello@hello.com')) 
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });

请注意,由于Firebase不允许在引用中使用某些字符(请参阅创建引用),我们将其.替换,为上面的代码中的一个。

用户回答回答于

我认为最好的方法是根据Firebase提供的auth对象定义用户的ID。当我创建我的用户时,我会:

FirebaseRef.child('users').child(id).set(userData);

这个ID来自:

var ref = new Firebase(FIREBASE);
var auth = $firebaseAuth(ref);
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) {
    var userData = {}; //something that also comes from authData
    Auth.register(authData.uid, userData);
}, function(error) {
    alert(error);
});

Firebase auth服务将始终确保其所有提供者的唯一id设置为uid。通过这种方式,你将始终拥有auth.uid,并且可以轻松地访问所需的用户来更新它,如下所示:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow');

扫码关注云+社区