【问题标题】:Get firebase database of current uid returns undefined获取当前uid的firebase数据库返回未定义
【发布时间】:2018-07-16 19:52:38
【问题描述】:

我有一个检索用户信息的页面,但我没有定义。

下面是我的数据结构

{
  "posts" : {
    "-L4QKxs6d06Vq3amQ7C8" : {
      "content" : "Test",
      "owner" : "D5hkgRIN87OUr3rdSGK1Znws1aB2",
      "title" : "Admin Post"
    },
    "-L4UDg1_glHcqwGjGpTQ" : {
      "content" : "fsdfd",
      "owner" : "D5hkgRIN87OUr3rdSGK1Znws1aB2",
      "title" : "rewsrwr"
    }
  },
  "users" : {
    "D5hkgRIN87OUr3rdSGK1Znws1aB2" : {
      "posts" : {
        "-L4QKxs6d06Vq3amQ7C8" : {
          "title" : "Admin post"
        },
        "-L4UDg1_glHcqwGjGpTQ" : {
          "title" : "rewsrwr"
        },
        "-L4UDj1vKnTpogjZ26Zg" : {
          "title" : "sdfsdf"
        }
      },
      "role" : "0",
      "username" : "Admin"
    }
  }
}

profile.ts

export class ProfilePage {
  currentUser = firebase.auth().currentUser;
  user: Observable<User[]>;

  constructor(public navCtrl: NavController, private db: AngularFireDatabase) {
    this.user = this.db.list(`/users/${this.currentUser.uid}`).snapshotChanges()
    .map(actions => {
      return actions.map(action => {
        return { key: action.key, ...action.payload.val() };
      });
    });
    console.log(this.user.username);
  }

}
  • “angularfire2”:“5.0.0-rc.4”,
  • “firebase”:“4.8.2”,

我在这里做错了吗?

【问题讨论】:

  • 请不要显示代码图像。将问题中的代码复制到代码块中。
  • 同样适用于 JSON。您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,总的来说这只是一件好事。
  • @DougStevenson 完成。
  • @FrankvanPuffelen 完成。

标签: firebase ionic-framework firebase-realtime-database angularfire2


【解决方案1】:

尝试改变

.map(actions => {
return actions.map(action => ({
  key: action.key, ...action.payload.val()
}));

部分到

.map(actions => {
return actions.map(action => {
  return { key: action.key, ...action.payload.val() };
});

【讨论】:

  • 执行 this.user.username 时仍然未定义
【解决方案2】:
import { AngularFireAuth } from 'angularfire2/auth';

export class ProfilePage {

  user: Observable<User>;

  constructor(public navCtrl: NavController, private db: AngularFireDatabase, private afAuth:AngularFireAuth) {

  }

  ngOnInit() {
      //get current user
        this.afAuth.authState.map((auth) =>  {
        if(auth != null) {
            this.user = this.db.list(`/users/${auth.uid}`).snapshotChanges()
            .map(actions => {
                return actions.map(action => {
                    return { key: action.key, ...action.payload.val() };
                });
            });
            this.user.subscribe(user=>{
                console.log(user.username);
            }
        } else {
            console.log('error getting user...')
        }
        }).subscribe();
  }

}

或者您可以在模板中使用它而无需订阅

<pre>{{(user | async)?.username}}</pre>

【讨论】:

  • 感谢您的回复,但我在拨打user.username时仍然不确定
  • 当代码运行时你可能没有得到用户 ID this.currentUser.uid。我更新了我的答案
  • this.currentUser.uid 工作得很好,我已经做了一个 console.log 来确定。无论如何,我想出了一个solution,它非常简单。
【解决方案3】:

我终于明白了!从angularfire2 issue#396得到一些提示

profile.ts

export class ProfilePage {
  currentUser = firebase.auth().currentUser;
  user: any;

  constructor(public navCtrl: NavController, private db: AngularFireDatabase) {
    this.db.list(`/users/${this.currentUser.uid}`).snapshotChanges().subscribe(user => {
      this.user = user.payload.val();
  }
    console.log(this.user.username);
  }

【讨论】:

  • 知道为什么这个完全相同的代码不能在另一个 page.ts 上运行吗?
猜你喜欢
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多