gpt4 book ai didi

javascript - FireStore 查询单个文档

转载 作者:行者123 更新时间:2023-11-30 20:47:16 25 4
gpt4 key购买 nike

背景:我正在尝试从一个集合中检索一个文档,该文档具有一个值而不是它的 ID。我基本上是在尝试制作一个登录系统。

我试过这个解决方案:Firestore : Retrieve a single document

使用 flat-map to 和 limit(1) 来做到这一点,但它似乎没有提供任何东西,这就是我的代码现在的样子:

this.user = this.afs.collection('users/', ref => ref.where('username',
'==', this.username).limit(1)).valueChanges().flatMap(result => result);
console.log(this.user.username);

输出是未定义的,但如果我只打印用户,我会得到可观察的

最佳答案

您应该将 this.user 设置为 Observable 引用,然后像这样订阅它:

this.user = this.afs.collection('users', (ref) => ref.where('username', '==', this.username).limit(1)).valueChanges();
// I removed the slash after 'users' as it isn't necessary

然后像这样订阅那个 Observable:

this.user.subscribe((user) => {
console.log(user);
});

这应该只返回一个结果。控制台记录 Observable 不会显示数据,而是记录 Observable 对象。

请注意,您应该拥有与该用户名相关联的 userId 并获取文档,因为它比获取与字段匹配的集合并将其限制为 1 更安全、更明确。如果这是身份验证问题,您应该使用 Firebase Auth 并使用任何形式的身份验证作为用户名,Firebase Auth 将处理没有重复登录的问题。如果希望使用用户名而不是电子邮件,您可以请求,但您的方法应该只返回请求的长度,如下所示:

 this.user = this.afs.collection('users', 
(ref) => {
return ref.where('username', '==', this.username).limit(1)
})
.snapshotChanges()
.map((users) => {
return users.length
});

这样您就不会在请求中返回用户对象,而是返回一个数字,如果它大于零,则用户已经拥有该用户名。

由于您使用的是 valueChanges() 而不是 snapshotChanges() ,因此您似乎不需要在将数据显示在 DOM 上之前对其进行操作,因此您不需要需要订阅数据,而是使用标记中的 ASYNC 管道订阅 Observable。这是我前几天回答的问题,它在这里解释了您的问题以及在您的标记中使用 ASYNC 管道:Angular Observable Array Object Conversion

关于javascript - FireStore 查询单个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com