【问题标题】:Firestore: is there a simple way to attach extra data to users?Firestore:有没有一种简单的方法可以将额外的数据附加给用户?
【发布时间】:2019-01-01 22:25:52
【问题描述】:

我使用推荐的方式在我的项目中通过createUserWithEmailAndPassword()函数创建一个Firestore的用户:

firebase.auth().createUserWithEmailAndPassword(this.email, this.password).then(
  (user) => {
    this.$store.commit('setUserId', user.user.uid);
  },
  (error) => {
    alert('Oops. ' + error.message)
  }
);

但是我想为每个用户附加额外的数据,即一个包含他/她从事的所有项目的对象。

Firestore 是否允许这样的事情(如果允许怎么办?),还是我必须通过创建自己的 userData 集合来手动处理这个问题,例如使用 userId 字段和额外的 projects 字段?

【问题讨论】:

  • 当然,Firestore 在存储内容方面相当灵活。您在为每个用户写入额外数据时遇到的问题是什么?你试过什么?
  • 我想我的问题是用户没有存储在集合中(我可以添加自己的字段),而是存储在我无法做到的内置容器中(或者至少我有不知道怎么做)。我可以创建一个集合并将其在我的代码中绑定到内置的用户容器(通过类似于 userId 外键的东西),但在忍受痛苦之前,我想确保没有比这更优雅和简单的东西了。跨度>

标签: firebase-authentication google-cloud-firestore


【解决方案1】:

我过去采用的方法是将专用“用户”集合中的文档与 Firebase 用户 UID 的 ID 配对。

db.collection('users').doc(firebase.auth().currentUser.uid).set(...)

然后在身份验证逻辑中检查用于记录用户帐户状态的任何标志;例如您可能希望执行入职培训等。

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    const userRecordRef = db.collection('users').doc(user.uid)
    userRecordRef.get()
    .then(doc => {
      if (doc.exists) {
        if (doc.data().onboardingStatus === 'new_user') {
          root.$router.push('/onboarding')
        }
        ...
    })
    .catch(...)
    ...
  }
  ...
}

应使用 Firestore 安全规则来确保用户文档在更新时处于正确状态,因为这是客户端代码。

【讨论】:

  • 谢谢@Alex,但是我的问题是,是否有一些更简单的内置替代方案可以替代您提出的解决方案。
【解决方案2】:

我知道这个问题很老,但我想发布我的答案,因为我正在使用 react-saga 来解决这个问题......

首先创建一个函数来获取你想要的数据:

    export const handleNewData = (testdata) => {
  return new Promise((resolve, reject) => {
    firestore
      .collection("users")
      .doc(firebase.auth().currentUser.uid)
      .set(testdata)
      .then((snapshot) => {
        const usersArray = snapshot.docs.map((doc) => {
          return {
            ...doc.data(),
            documentID: doc.id,
          };
        });
        resolve(usersArray);
      })
      .catch((err) => {
        reject(err);
      });
  });
};

然后创建一个新函数来处理你的数据到你的数据库(在这个函数中也放你的旧数据)代码示例:

        export function* addData({
  payload: {
    newData1,
    newData2,
    newData3,
    birthDay,
    firstName,
    lastName,
    nickName,
    email,
  },
}) {
  try {
    yield handleNewData({
      newData1,
      newData2,
      newData3,
      birthDay,
      firstName,
      lastName,
      nickName,
      email,
      userUID: auth.currentUser.uid,
    });
  } catch (err) {}
}

export function* onAddTestData() {
  yield takeLatest(userTypes.ADD_NEW_DATA_START, addData);
}

最后一步也是最重要的 不要忘记在新表单中获取您的数据并再次发送您的值!

      const handleFormSubmit = (event) => {
    event.preventDefault();
    dispatch(
      addDataStart({
        newData1,
        newData2,
        newData3,
        birthDay: userDetails.birthDay,
        firstName: userDetails.firstName,
        lastName: userDetails.lastName,
        nickName: userDetails.nickName,
        email: userDetails.email,
      })
    );
  };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2019-03-10
    相关资源
    最近更新 更多