【问题标题】:Problem creating document within subcollection在子集合中创建文档时出现问题
【发布时间】:2020-05-26 10:37:58
【问题描述】:

我正在处理注册表单。用户注册,然后在Firebase的“companies”集合中我添加一个新的公司,然后在刚刚创建的公司下添加一个“users”集合,并将刚刚创建的用户作为文档添加到公司中。

在我的代码尝试在刚刚创建的公司下添加一个新集合“用户”之前,一切正常。到目前为止,这是我的代码:

return async (dispatch, getState) => {
    try {
        const { companyName, email, password } = getState().user;
        const response = await Firebase.auth().createUserWithEmailAndPassword(
            email,
            password
        );
        if (response.user.uid) {

            // Set up company
            const company = {
                name: companyName,
                owner: response.user.uid
            };

            // Create company
            db.collection("companies")
                .add(company)
                .then(ref => {

                    console.log("Company ID ", ref.id);
                    console.log("User ID ", response.user.uid);

                    // Set up first user
                    const user = {
                        uid: response.user.uid,
                        email: email
                    };

                    // Add first User
                    db.doc(ref.id)
                        .collection("users")
                        .add(user);

                });

            dispatch({ type: SIGNUP, payload: user });
        }
    } catch (e) {
        alert(e);
    }
};

那些 console.logs 返回正确的 ID,所以看起来我对刚刚创建的公司的引用是如何创建的?我该如何解决?

【问题讨论】:

    标签: javascript firebase react-native google-cloud-firestore


    【解决方案1】:

    db.doc(ref.id).collection("users").add(user) 可能是错误的。

    你可以试试ref.collection("users").add(user)db.collection("companies").doc(ref.id).collection("users").add(user);

                        // Add first User
                        // db.doc(ref.id)
                        //    .collection("users")
                        //    .add(user);
                        ref.collection("users").add(user);
                        // db.collection("companies").doc(ref.id).collection("users").add(user);
    

    见:

    【讨论】:

      【解决方案2】:

      除了zkohi的正确答案,注意你是把async/await和then()混用了,不推荐。以下应该可以解决问题(未经测试):

        return async (dispatch, getState) => {
          try {
            const { companyName, email, password } = getState().user;
            const response = await Firebase.auth().createUserWithEmailAndPassword(
              email,
              password
            );
            if (response.user.uid) {
              // Set up company
              const company = {
                name: companyName,
                owner: response.user.uid,
              };
      
              // Create company
              const compRef = await db.collection('companies').add(company);
      
              console.log('Company ID ', compRef.id);
      
              const user = {
                uid: response.user.uid,
                email: email,
              };
      
              await compRef.collection('users').add(user);
      
              dispatch({ type: SIGNUP, payload: user });
            }
          } catch (e) {
            alert(e);
          }
        };
      

      注意我们如何定义users 子集合:

      compRef.collection('users').add(user);
      

      只需在公司的DocumentReference 上调用collection() 方法即可。最后一点与zkohi的回答一致。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        相关资源
        最近更新 更多