Firestore用户管理最佳做法?

时间:2019-01-13 21:19:42

标签: firebase vue.js firebase-authentication nuxt.js

因此,我正在使用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身份验证捆绑在一起?

2 个答案:

答案 0 :(得分:3)

这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。因此,这实际上是一个很好的问题,并且有一个最佳实践(一个没有问题的答案)。以下基于标准JavaScript。我对vue或nuxt框架不熟悉。

关于存储用户个人资料数据,最佳实践是在数据存储区(实际上是在Firestore(RTDB的下一代版本)中)创建users集合。将firebase.auth().currentUser.uid用作每个用户记录的文件ID /名称(或在Firestore术语中为 document )。 firebase.auth().currentUser对象是通过.onAuthStateChanged观察者填充的。因此,例如,您可以说firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25})来节省用户年龄。

虽然没有完成。

您不需要在每次需要读取用户配置文件数据时都查询数据存储。因此,您要做的就是在登录后将实时侦听器(.onSnapshot)附加到用户文档。拥有一个名为userDocument的应用程序级/全局变量,然后执行userDocument = userDocuserDoc是您的实时更新返回给您的对象。

现在您所要做的就是读取局部userDocument变量(立即,没有获取延迟)。对于其他数据(例如购物车(文档)),这种方法也是最佳做法。

答案是2部分:用户个人资料数据(例如年龄,喜欢的颜色,购物车ID等)存储在users提供的uid下的firebase.auth()集合中。然后,最后,订阅该用户文档,以便对它进行任何更改后,您的应用程序(脚本)将立即使用所有数据进行刷新(与按需获取文件相比)。

答案 1 :(得分:1)

一种更常规的方法是使用UID作为文档的ID。这样,您只需说出以下内容即可找到文档:

db.collection('users').doc(uid).get()   // either 0 or 1 document

这比必须执行查询和必须执行具有限制的查询要容易得多。如果您现在拥有的是什么,如果“用户”不小心为一个特定的uid获取了两个文档,该怎么办?