我希望能够在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保存在数组中。如果保存在数组中不理想,或者有更好的方法,我愿意接受任何建议。
1条答案
按热度按时间bejyjqdl1#
我试图在创建用户时创建集合,以便稍后可以对其进行读/写,但我不知道如何创建集合。
(子)集合只有在您在其中创建第一个文档时才会创建。没有文档的情况下,无法 * 实体化 * 空集合。
在使用
doc()
方法时出现如下错误是正常的因为这个方法是用来创建一个
DocumentReference
的,所以你需要传递一个偶数段的路径。您可以使用
collection()
方法并传递3个段,为bookmarks
子集合定义CollectionReference
,如下所示但是,在您向其中添加文档之前,它不会存在于数据库中。
**结论:**首次为用户创建书签时,将自动创建该用户得
bookmarks
子收藏集.例如: