每个用户的Firebase文档?

时间:2018-04-29 12:23:01

标签: javascript firebase google-cloud-firestore

我想知道如何在每个用户创建帐户时使用Firebase Web制作文档。我启用了Firebase身份验证并且正常工作,我希望每个用户在Cloud Firestore中将文档放在名为users的集合中。如何获取UID然后自动为每个用户创建文档? (我这样做是为了让日历事件可以保存到文档中的数组字段中,但我需要一个文档供用户使用)。我知道并知道如何制定访问的安全规则,我只是不知道如何制作文档。 谢谢!

3 个答案:

答案 0 :(得分:3)

虽然可以通过云功能创建用户配置文件,但正如Renaud和guillefd建议的那样,也可以考虑直接从应用程序代码创建文档。该方法非常相似,例如如果您使用电子邮件+密码登录:

firebase.auth().createUserWithEmailAndPassword(email, password)
  .then(function(user) {
    // get user data from the auth trigger
    const userUid = user.uid; // The UID of the user.
    const email = user.email; // The email of the user.
    const displayName = user.displayName; // The display name of the user.

    // set account  doc  
    const account = {
      useruid: userUid,
      calendarEvents: []
    }
    firebase.firestore().collection('accounts').doc(userUid).set(account); 
  })
  .catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });

除了直接从Web应用程序运行外,此代码还创建了以用户的UID作为键的文档,这使后续查找更简单。

答案 1 :(得分:0)

您必须设置由onCreate() Auth trigger触发的firebase功能 1.创建功能触发器
2.获取用户创建的数据
3.设置帐户数据 4.将帐户数据添加到集合中。

<强>功能/ index.js

// Firebase function 

exports.createAccountDocument = functions.auth.user().onCreate((user) => {
  // get user data from the auth trigger
  const userUid = user.uid; // The UID of the user.
  //const email = user.email; // The email of the user.
  //const displayName = user.displayName; // The display name of the user.

  // set account  doc  
  const account = {
    useruid: userUid,
    calendarEvents: []
  }
  // write new doc to collection
  return admin.firestore().collection('accounts').add(account); 
});

答案 2 :(得分:0)

如果您使用 Firebase UI 来简化您的生活,您可以将用户文档添加到 Firestore 中的“/users”集合中第一次< /em> 在您的 UI 配置中使用 authResult.additionalUserInfo.isNewUser 中的 signInSuccessWithAuthResult 进行注册。

我正在我的项目中做这样的事情:

let uiConfig = {
...
  callbacks: {
    signInSuccessWithAuthResult: (authResult) => {
      // this is a new user, add them to the firestore users collection!
      if (authResult.additionalUserInfo.isNewUser) {
        db.collection("users")
          .doc(authResult.user.uid)
          .set({
            displayName: authResult.user.displayName,
            photoURL: authResult.user.photoURL,
            createdAt: firebase.firestore.FieldValue.serverTimestamp(),
          })
          .then(() => {
            console.log("User document successfully written!");
          })
          .catch((error) => {
            console.error("Error writing user document: ", error);
          });
      }
      return false;
    },
  },
...
}
...
ui.start("#firebaseui-auth-container", uiConfig);

signInSuccessWithAuthResult 为您提供一个 authResult 和一个 redirectUrl

来自Firebase UI Web Github README

// ...
signInSuccessWithAuthResult: function(authResult, redirectUrl) {
  // If a user signed in with email link, ?showPromo=1234 can be obtained from
  // window.location.href.
  // ...
  return false;
}