【问题标题】:How do I remove a user by key or value?如何通过键或值删除用户?
【发布时间】:2017-07-22 20:15:37
【问题描述】:

我的 Firebase 数据库中有这样的结构:

--users
    --v7BwBnUBqJMXCtoOHYE51jXCwhY2: uid
    --etc

当用户像这样通过身份验证时,会填充用户“表”:

  loginFb() {
    this.af.auth.login({
      provider: AuthProviders.Facebook,
      method: AuthMethods.Popup,
    }).then(
        (user) => {
        this.userOnline(user.uid, 'uid');
        this.router.navigate(['/members']);
      }).catch(
        (err) => {
        this.error = err;
      })
  }

  userOnline(uid, value) {
    const users = this.af.database.object('/users');
    users.update({ [uid]: value });
  }

这会在由 fb 生成的用户表中为 ea 用户提供一个 uid。

我想在用户注销时删除他们。研究这个我遇到了这个answer

我是这样应用的:

  logout(userUID) {
    this.af.auth.logout();
    this.userOffline(userUID);
    this.router.navigateByUrl('/login');
  }

  userOffline(userUID) {

    const user = this.af.database.list('/', {
      query: {
        orderByChild: userUID,
        equalTo: 'uid'
      }
    });

    user.subscribe(snapshots=>{
      snapshots.forEach(snapshot => {
        console.log(snapshot);
        snapshot.ref.remove();
      });
    })

  }

console.log 的结果是:

Object {v7BwBnUBqJMXCtoOHYE51jXCwhY2: "uid", $key: "users"}

唉,我得到了这个错误:

Cannot read property 'remove' of undefined

我确信有更好的方法可以做到这一点,但我找不到任何东西。任何建议表示赞赏。

编辑

感谢@pengyy 的评论,我对他们的建议做了一些小修改。

user.subscribe(snapshots=>{
  snapshots.forEach(snapshot => {
    console.log(snapshot);
    this.af.database.list('/users').remove(snapshot.userUID)
  });
})

这可以工作并删除用户,但即使在调用该函数时,它也会在页面加载时立即这样做......情节变厚了

【问题讨论】:

  • 为什么每次用户登录时都要不断地写入表并删除?如果这些数据无论如何都会被删除,那么保留角度不是更好吗?
  • 我想随时知道谁登录/在线
  • 虽然@EduardoDennis 拥有一个用户列表并在登录和退出时更改“在线状态”会更好吗?我认为这是有道理的,因为我还想保留用户所属的组。谢谢

标签: angular firebase firebase-realtime-database angularfire2


【解决方案1】:

从表格中删除项目

this.af.database.list('/users').remove(snapshot.$key)

【讨论】:

  • 恐怕用户还在。 snapshot.$key 只返回 'user' 所以它不起作用。
  • 对不起,首先,您应该查询 $key 的确切表“用户”。编辑后的意思是在调用函数之前删除用户?
  • 必须标记除您要回复的帖子(问题或答案)的作者以外的任何人。 Smiter 可能从未见过你回答。您通过键入@ 和第一个字母来标记人员,将显示一个自动完成列表。我不需要标记你,因为你是我要回复的作者。 另外也许您可以编辑您的答案并详细说明以帮助此人和其他人更多。
【解决方案2】:
  userOffline(userUID) {
    this.af.database.list('/users/'+userUID).remove();
  }

所以这行得通。这么简单……

感谢@pengyy,如果没有你们的 cmets,我就无法到达那里。

【讨论】:

  • 我最终使用了这种方法:--- logout(userUID) { this.af.auth.logout(); this.userOffline(userUID); this.router.navigateByUrl('/login'); } --- userOffline(userUID) { const user = this.af.database.list('/users'); user.update(userUID, { userOnline: false }); } --- 因为这将保留用户数据。使用更新而不是推送,以免删除现有数据。参考docs
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 2013-10-22
  • 1970-01-01
  • 2017-01-11
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多