Cloud Firestore 保存额外的用户数据

Posted

技术标签:

【中文标题】Cloud Firestore 保存额外的用户数据【英文标题】:Cloud Firestore saving additional user data 【发布时间】:2018-08-15 08:37:33 【问题描述】:

如何在 Cloud Firestore 数据库中保存其他用户数据?我的意思是,哪一个是正确的方法?我想创建一个用户集合,我可以在其中存储他们的用户名和其他数据。我已经找到了关于这个问题的答案,但他们都在使用“旧”的 Firebase 实时数据库解决方案。

现在我是这样做的(这是一个Vue组件):

methods: 
    doSignUp () 
      if (!this.email || !this.password) 
        return
      
      firebase.auth().createUserWithEmailAndPassword(this.email, this.password)
        .then(data => 
          this.createUser(data)
        ).catch(err => console.log(err))
    ,
    createUser (userObject) 
      const docRef = this.$store.getters.getDB.collection('users')
      const username = userObject.email.split('@')[0]
      docRef
        .doc(username)
        .set(
          id: userObject.uid,
          username
        ).then().catch((err) => console.log(err))
    
  

在上面的示例中,我只是简单地在“users”集合中创建了一个新文档,并将用户的 ID 保存为“id”。这是正确的方法吗?我不确定。

【问题讨论】:

在您的示例中,“用户名”可能不是唯一的 是的,我知道,感谢您的评论。它只是一个学习 Vue 和 Firebase 的演示应用。 这正是我的方法。您最终得到 2 个用户列表,您需要注意,如果用户想要删除他的个人资料,您需要将他从 2 个地方删除,但除此之外没关系 你还需要检查用户是否已经退出 【参考方案1】:

我认为你的例子没有什么不好。当然,只要您在 firestore 数据库上设置适当的安全规则 :)

另一件事是,IMO 使用实时数据库和 Firestore 没有区别。不同之处在于架构及其“幕后”的工作方式,但总体用法非常相似(API 与 AFAIK 略有不同)。

我可以向您推荐的另一种解决方案是使用 Firebase 函数和 Firestore 触发器在您的 Web 应用程序外部写入数据库内容 - https://firebase.google.com/docs/auth/extend-with-functions 此解决方案将消除客户端上 createUser 函数的必要性.

【讨论】:

我忽略了这些“云功能”,感谢您的建议! @sarneeh "Of course as long as you set up proper security rules on your firestore database :) " 这些适当的规则是什么?因为此时,没有用户通过身份验证。那么如何以安全/可靠的方式保存用户文档呢? (除了使用触发器...) @Vegar 我对 Firebase 不是很有经验,但我会考虑使用匿名身份验证:firebase.google.com/docs/auth/web/anonymous-auth 我是新手,但遵循了一个教程,该教程做了@zedz01 在问题中建议的操作,但是他们还说您应该保护数据库免受匿名访问,因为他们的代码并没有真正起作用。 ..您的建议可能有效,但听起来不像应该这样做。喜欢你的触发器/功能更好。会调查的。 嗯...根据文档,用户应该在调用createUser... 后登录,所以我猜肯定有其他问题...【参考方案2】:

是的,这是正确的方法,您将有一个名为 Users 的集合,在该集合中将有一个文档,它是 doc(username),其值为 id: userid

您还可以将userid 保存为一个对象,在该对象内您将拥有与该useruid 相关的值

像这个例子:

var frankDocRef = db.collection("users").doc("frank");
frankDocRef.set(
    name: "Frank",
    favorites:  food: "Pizza", color: "Blue", subject: "recess" ,
   age: 12
 );

https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

【讨论】:

以上是关于Cloud Firestore 保存额外的用户数据的主要内容,如果未能解决你的问题,请参考以下文章

将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中

如何将具有动态 ID 的文档保存到 Cloud Firestore?总是在变化

如何限制用户仅从 Cloud Firestore 检索他们的数据?

Cloud Firestore:从 API 添加和更新数据

Flutter 使用 Cloud Firestore 和 Firebase Auth 存储用户数据

限制通过VPC网络访问Google Cloud Firestore。