因此,我正在使用Firestore和Nuxt开发一个web应用程序,在进行身份验证的同时,我想确保我遵循的是最佳实践。
使用Firebase身份验证只给我一个标识符(在本例中为电子邮件)和一个UID。然后,我创建了一个用户集合来存储其他数据,如:
{
"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身份验证联系在一起?
发布于 2019-01-14 03:37:06
这个问题引出了另一个问题:处理应用程序状态的最佳实践(包括用户状态)。因此,这实际上是一个很好的问题,而且有一个最佳实践(一个非固执己见的答案)。下面是基于标准的JavaScript。我不熟悉vue或nuxt框架。
关于存储用户配置文件数据,最佳实践是在您的数据存储区中创建一个users集合,实际上是在Firestore (下一代版本的RTDB)中。使用firebase.auth().currentUser.uid作为每个用户记录的文档id/名称(或文档,用Firestore表示)。firebase.auth().currentUser对象是通过.onAuthStateChanged观察者填充的。例如,您可以使用firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25})来节省用户的年龄。
不过还没做完。
您不希望每次需要读取用户配置文件数据时都要查询数据存储。因此,您要做的是在登录时将一个实时侦听器(.onSnapshot)附加到用户文档。有一个名为userDocument和do userDocument = userDoc的应用程序级/全局变量。userDoc是通过实时更新返回给您的对象。
现在,您要做的就是读取本地userDocument变量(立即,没有获取延迟)。这种方法也适用于其他数据,如购物车(文档)。
因此,答案是2部分:用户配置文件数据(如年龄、最喜欢的颜色、购物车id等)存储在users集合中,该集合由firebase.auth()提供。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用程序(脚本)将立即使用所有这些数据进行刷新(vs按需获取)。
发布于 2019-01-13 21:31:37
一种更传统的方法是使用UID作为文档的ID。这使您可以简单地通过以下方式找到文档:
db.collection('users').doc(uid).get() // either 0 or 1 document这比必须执行查询和有限制地执行查询更容易。如果“用户”意外地为特定的uid获取了两个文档,那么您现在拥有的内容会发生什么呢?
https://stackoverflow.com/questions/54173320
复制相似问题