Firestore 用户管理最佳实践?
Firestore User Management Best Practices?
所以我正在使用 Firestore 和 Nuxt 开发一个网络应用程序,在我进行身份验证的同时,我想确保我遵循了最佳实践。
使用 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 身份验证绑定在一起?
更常规的方式是使用UID作为文档的ID。这让您只需说:
即可找到文档
db.collection('users').doc(uid).get() // either 0 or 1 document
这比必须执行查询和必须执行有限制的查询更容易。当你现在拥有的时候,如果 'users' 不小心得到了一个特定 uid 的两个文档会怎样?
这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,并且有一个最佳实践(一个非固执己见的答案)。以下基于标准JavaScript。我对 vue 或 nuxt 框架不熟悉。
关于存储用户配置文件数据,最佳做法是在您的数据存储中创建一个 users
集合,实际上是在 Firestore(RTDB 的下一代版本)中。使用 firebase.auth().currentUser.uid
作为每个用户记录的文档 id/name(或 Firestore 术语中的 文档 )。 firebase.auth().currentUser
对象是通过 .onAuthStateChanged
观察者填充的。例如,您会说 firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25})
来保存用户年龄。
虽然还没有完成。
您不希望每次需要读取用户配置文件数据时都必须查询数据存储。因此,您要做的是在登录时将实时侦听器 (.onSnapshot
) 附加到用户文档。有一个名为 userDocument
的 app-level/global 变量并执行 userDocument = userDoc
。 userDoc
是您的实时更新返回给您的对象。
现在您所要做的就是读取本地 userDocument
变量(立即,没有获取延迟)。这种方法也是其他数据(例如购物车(文档))的最佳实践。
所以,答案是 2 部分:年龄、最喜欢的颜色、购物车 ID 等用户个人资料数据存储在 firebase.auth()
提供的 uid 下的 users
集合中。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用程序(脚本)会立即刷新所有数据(与按需获取相比)。
所以我正在使用 Firestore 和 Nuxt 开发一个网络应用程序,在我进行身份验证的同时,我想确保我遵循了最佳实践。
使用 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 身份验证绑定在一起?
更常规的方式是使用UID作为文档的ID。这让您只需说:
即可找到文档db.collection('users').doc(uid).get() // either 0 or 1 document
这比必须执行查询和必须执行有限制的查询更容易。当你现在拥有的时候,如果 'users' 不小心得到了一个特定 uid 的两个文档会怎样?
这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,并且有一个最佳实践(一个非固执己见的答案)。以下基于标准JavaScript。我对 vue 或 nuxt 框架不熟悉。
关于存储用户配置文件数据,最佳做法是在您的数据存储中创建一个 users
集合,实际上是在 Firestore(RTDB 的下一代版本)中。使用 firebase.auth().currentUser.uid
作为每个用户记录的文档 id/name(或 Firestore 术语中的 文档 )。 firebase.auth().currentUser
对象是通过 .onAuthStateChanged
观察者填充的。例如,您会说 firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25})
来保存用户年龄。
虽然还没有完成。
您不希望每次需要读取用户配置文件数据时都必须查询数据存储。因此,您要做的是在登录时将实时侦听器 (.onSnapshot
) 附加到用户文档。有一个名为 userDocument
的 app-level/global 变量并执行 userDocument = userDoc
。 userDoc
是您的实时更新返回给您的对象。
现在您所要做的就是读取本地 userDocument
变量(立即,没有获取延迟)。这种方法也是其他数据(例如购物车(文档))的最佳实践。
所以,答案是 2 部分:年龄、最喜欢的颜色、购物车 ID 等用户个人资料数据存储在 firebase.auth()
提供的 uid 下的 users
集合中。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用程序(脚本)会立即刷新所有数据(与按需获取相比)。