如何在Firebase / Firestore中创建用户时创建嵌套集合,用户可以在其中保存已添加书签的项目

cgvd09ve  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(130)

我希望能够在firebase/firestore中有一个嵌套的集合,在那里我可以保存一个经过身份验证的用户收藏夹。我试图在创建用户时创建集合,这样我就可以在以后读/写它,但是我不知道如何创建集合。我有这样的东西:

//This function creates a new user. If the user already exists, no new document will be created
export const createUserDocumentFromAuth = async (
  userAuth,
  additionalInfo = {}
) => {
  if (!userAuth) return;

  const userDocRef = doc(db, 'users', userAuth.uid); //database instance, collection, identifier
  const bookmarkRef = doc(db, 'users', userAuth.id, 'bookmarks'); //This triggers error
  const userSnapshot = await getDoc(userDocRef);
  if (!userSnapshot.exists()) {
    //If user snapshot doesn't exist - create userDocRef
    const { displayName, email } = userAuth;
    const createdAt = new Date();

    try {
      await setDoc(userDocRef, {
        displayName,
        email,
        createdAt,
        ...additionalInfo,
      });
      setDoc(bookmarkRef, { //Try to create a bookmarks collection here
        favorites: []
      })
    } catch (error) {
      console.log('Error creating user', error.message);
    }
  }
  //if user data exists
  return userDocRef;
};

我可以很好地创建用户,但不能同时创建另一个收藏。我也尝试过在登录用户单击书签按钮时创建收藏,但每次都出现类型错误Uncaught (in promise) TypeError: n is undefined

export const addBookmarkForUser = async (userAuth, showId) => {
  const bookmarkRef = doc(db, 'users', userAuth.id, 'bookmarks');
  try {
    await setDoc(bookmarkRef, {
      favorites: showId
    });
  }catch(error){
    console.log('error creating bookmark', error.message)
  } 
};

我是Firebase / Firestore的新手,我所希望的是当用户点击按钮时,能够将物品id保存在数组中。如果保存在数组中不理想,或者有更好的方法,我愿意接受任何建议。

bejyjqdl

bejyjqdl1#

我试图在创建用户时创建集合,以便稍后可以对其进行读/写,但我不知道如何创建集合。
(子)集合只有在您在其中创建第一个文档时才会创建。没有文档的情况下,无法 * 实体化 * 空集合。
在使用doc()方法时出现如下错误是正常的

const bookmarkRef = doc(db, 'users', userAuth.id, 'bookmarks');

因为这个方法是用来创建一个DocumentReference的,所以你需要传递一个偶数段的路径。
您可以使用collection()方法并传递3个段,为bookmarks子集合定义CollectionReference,如下所示

const bookmarkRef = collection(db, 'users', userAuth.id, 'bookmarks');

但是,在您向其中添加文档之前,它不会存在于数据库中。

**结论:**首次为用户创建书签时,将自动创建该用户得bookmarks子收藏集.

例如:

const bookmarksCollectionRef = collection(db, 'users', userAuth.id, 'bookmarks');
await bookmarksCollectionRef.add({ ... })

相关问题