Firebase Firestore用户管理最佳实践?
因此,我正在使用Firestore和Nuxt开发一个web应用程序,当我的身份验证工作正常时,我想确保我遵循了最佳实践 使用Firebase身份验证只会给我一个标识符(本例中为电子邮件)和一个UID。然后,我创建了一个用户集合来存储其他数据,例如:Firebase Firestore用户管理最佳实践?,firebase,vue.js,firebase-authentication,nuxt.js,Firebase,Vue.js,Firebase Authentication,Nuxt.js,因此,我正在使用Firestore和Nuxt开发一个web应用程序,当我的身份验证工作正常时,我想确保我遵循了最佳实践 使用Firebase身份验证只会给我一个标识符(本例中为电子邮件)和一个UID。然后,我创建了一个用户集合来存储其他数据,例如: { "UID": "6TIupYLKlcOE97b5Fe63uinf6Ik1", "app_metadata": { "role": "admin", "status": "approved" }, "firstNam
{
"UID": "6TIupYLKlcOE97b5Fe63uinf6Ik1",
"app_metadata": {
"role": "admin",
"status": "approved"
},
"firstName": "Jon",
"lastName": "Doe"
}
目前,我正在对用户进行身份验证以获取用户角色后执行以下操作:
// Getting user details
db.collection('users')
.where('UID', '==', user.uid)
.limit(1)
.get()
.then((snapshot) => {
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data().app_metadata.role)
dispatch('setROLE', doc.data().app_metadata.role)
})
})
.catch((err) => {
console.log('Error getting documents', err);
})
是否有更好的方法来处理存储额外的用户数据并将其与Firebase身份验证结合起来?更传统的方法是使用UID作为文档的ID。这样,您只需说一下即可找到文档:
db.collection('users').doc(uid).get() // either 0 or 1 document
这比必须执行查询和执行有限制的查询更容易。如果“用户”意外地为某个特定uid获取了两个文档,那么您现在所拥有的将会发生什么呢?这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,并且有一个最佳实践(非固执己见的答案)。下面是基于标准JavaScript的。我不熟悉vue或nuxt框架 关于存储用户配置文件数据,最佳做法是在数据存储中创建
users
集合,实际上是在Firestore(RTDB的下一代版本)中。使用firebase.auth().currentUser.uid
作为每个用户记录(或Firestore行话中的文档)的文档id/名称。firebase.auth().currentUser
对象通过.onAuthStateChanged
观察者填充。例如,您可以说firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25})
来保存用户年龄
不过还没做完
您不希望每次需要读取用户配置文件数据时都必须查询数据存储。因此,您要做的是在登录时将实时侦听器(.onSnapshot
)附加到用户文档。拥有一个名为userDocument
的应用程序级别/全局变量,并执行userDocument=userDoc
userDoc
是实时更新返回给您的对象
现在,您所要做的就是读取本地userDocument
变量(立即,无获取延迟)。这种方法也是其他数据(如购物车(文档))的最佳实践
因此,答案分为两部分:年龄、喜爱的颜色、购物车id等用户配置文件数据存储在
users
集合中,该集合位于firebase.auth()提供的uid下。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用程序(脚本)会立即刷新所有数据(而不是按需获取数据)。您可以看看2021年的最佳做法是这样吗?如果是,你能提供一个代码示例吗?如果有帮助的话,我正在使用Nuxt/Vue。谢谢你有趣的观点!