在子集合中创建文档时遇到问题

时间:2020-05-26 10:37:58

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

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

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

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,所以我对刚刚创建的公司的引用的创建方式似乎有问题?我该如何解决?

2 个答案:

答案 0 :(得分:2)

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);

请参阅:

答案 1 :(得分:1)

除了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的答案是一致的。