firebase - Firestore 用户管理最佳实践?
问题描述
因此,我正在使用 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 身份验证绑定在一起?
解决方案
这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,并且有一个最佳实践(一个非主观的答案)。下面是基于标准 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
和 do userDocument = userDoc
。 userDoc
是您的实时更新返回给您的对象。
现在您所要做的就是读取该局部userDocument
变量(立即,没有获取延迟)。这种方法也是购物车(文档)等其他数据的最佳实践。
所以,答案是 2 部分:用户个人资料数据,如年龄、喜欢的颜色、购物车 ID 等,存储在users
由 uid 提供的集合中firebase.auth()
。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用程序(脚本)会立即使用所有数据刷新(而不是按需获取)。
推荐阅读
- reactjs - 如何在打字稿和反应项目中重构一种类型的表达式
- javascript - 取消转义 JSON 数据值以断言
- sh - 返回 POSIX sh 管道内块中设置的值
- javascript - JavaScript 变量分配给什么类?
- visual-studio - 新的 .csproj 格式的 app.config 文件
- ssis - Dtexec ISSERVER 返回的不是有效的服务器包路径
- java - 我对java完全陌生,想知道是否有任何方法可以改进这个程序
- node.js - 带有“/”的欢迎页面和未找到用于休息的页面
- python - 在 SQLAlchemy 中交叉应用?
- python-3.x - 如何根据字典中单个键的一部分对 dict.keys() 或 dict 进行排序(python)