代码之家  ›  专栏  ›  技术社区  ›  Chris F.

FireStore用户管理最佳实践?

  •  1
  • Chris F.  · 技术社区  · 5 年前

    因此,我正在开发一个使用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 回复  |  直到 5 年前
        1
  •  2
  •   Ronnie Royston    5 年前

    这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,有一个最佳实践(一个非固执己见的答案)。下面是基于标准的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 并且做 userDocument = userDoc . userDoc 通过实时更新返回给您的对象。

    现在你要做的就是读当地的 用户文档 变量(立即,无获取延迟)。这种方法也是其他数据(如购物车(文档))的最佳实践。

    因此,答案是2部分:用户配置文件数据(如年龄、最喜欢的颜色、购物车ID等)存储在 用户 在由提供的uid下收集 firebase.auth() . 最后,订阅该用户文档,以便在对其进行任何更改时,应用程序(脚本)立即使用所有数据进行刷新(而不是按需获取)。

        2
  •  1
  •   Doug Stevenson    5 年前

    更传统的方法是使用uid作为文档的ID。这样,您只需说:

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

    这比进行查询和执行有限制的查询更容易。如果“用户”意外地为一个特定的uid获取了两个文档,那么您现在拥有的是什么呢?