我的Firebase实时数据库的结构如下:

{
 "users" : {
    "P55dsK5xQaM3FhnsCcI5Oxnyi7v1" : {
      "email" : "myemail@gmail.com",
      "isAdmin" : true,
      "name" : "Vik Kumar"
    }
  }
}


我正在使用angularfire2查询数据,如下所示

getUserByEmail(email:string){
    console.log("start of getUserByEmail with email:" + email)
    return new Promise((resolve, reject) =>
      {

        this.db.list("/users",
          ref => ref.orderByChild('email').startAt(email)
        ).valueChanges().subscribe(
          res => {
            console.log('response:' + JSON.stringify(res))
            resolve(res)
          },
          err => {
            console.log(err)
            reject(err)
          }
        )
      })
  }


这按预期工作。但是,我需要此节点的ID“ P55dsK5xQaM3FhnsCcI5Oxnyi7v1”以及执行某些操作。我怎么得到的?

我的业务用例
用户在注册时被添加到注释用户节点。上面的要求来自管理员用户想要更新用户数据的地方。因此,他通过电子邮件搜索用户,然后对其进行更新。

因此,以上代码用于通过电子邮件搜索用户。现在,要进行更新,我需要获取节点ID。

最佳答案

我不确定您为什么在这里使用AngularFire。借助适用于JavaScript的常规Firebase SDK,您可以执行以下操作:

getUserByEmail(email:string){
  console.log("start of getUserByEmail with email:" + email)
  return new Promise((resolve, reject) =>{
    firebase.database()
      .ref("/users")
      .orderByChild('email')
      .startAt(email)
      .once('child_added')
      .then(snapshot => {
        resolve(snapshot.key);
      })
      .catch(err => {
        console.log(err)
        reject(err)
      })
  });
}


通过监听once('child_added',我们得到的snapshot仅包含与查询匹配的第一个子节点。



请注意,现在搜索将匹配email之后的任何用户,而我感觉您只想查找以email开头的用户。在这种情况下,您还需要添加endAt()子句:

firebase.database()
  .ref("/users")
  .orderByChild('email')
  .startAt(email)
  .endAt(email+'\uF7FF')
  .once('child_added')

09-25 18:26
查看更多