我正在嘗試在與登錄用戶(相同的 UID)相關的檔案中添加新欄位,以創建與用戶的 UID 具有相同 UID 的新檔案我使用以下內容:
const collectionRef = collection(db, 'data');
// submit function to add data
const handleSubmit = async (e) => {
e.preventDefault();
onAuthStateChanged(auth, async (user) => {
const uid = user.uid;
try {
// overrides the data
await setDoc(doc(collectionRef, uid), {
food: food,
quantity: quantity,
})
alert("Data added successfully")
} catch (error) {
alert(`Data was not added, ${error.message}`)
}
}, [])
}
為了向陣列添加更多欄位,我使用以下內容:
const collectionRef = collection(db, 'data');
// submit function to add data
const handleSubmit = async (e) => {
e.preventDefault();
onAuthStateChanged(auth, async (user) => {
const uid = user.uid;
try {
await updateDoc(doc(collectionRef, uid), {
food: arrayUnion(food),
quantity: arrayUnion(quantity),
})
alert("Data added successfully")
} catch (error) {
alert(`Data was now added, ${error.message}`)
}
}, [])
}
完整代碼:
const collectionRef = collection(db, 'data');
const handleSubmit = async (e) => {
e.preventDefault();
onAuthStateChanged(auth, async (user) => {
const uid = user.uid;
try {
// overrides the data - ???
await setDoc(doc(collectionRef, uid), {
food: food,
quantity: quantity,
})
// add more fields to the array
await updateDoc(doc(collectionRef, uid), {
food: arrayUnion(food),
quantity: arrayUnion(quantity),
})
alert("Data added successfully")
} catch (error) {
alert(`Data was now added, ${error.message}`)
}
}, [])
}
我可以使用 updateDoc() 函式添加更多欄位,但是如果我在創建新檔案后不注釋或洗掉 setDoc() 函式,它將覆寫檔案內的欄位。
DB (Firestore) 的螢屏截圖:只有在首次創建檔案后注釋 setDoc() 函式時,我才能添加更多欄位
火庫
uj5u.com熱心網友回復:
如果要創建或更新檔案,可以使用{ merge: true }:
await setDoc(doc(collectionRef, uid), {
food: food,
quantity: quantity,
}, { merge: true }) // ??
另請參閱有關設定檔案的檔案中的第二個代碼片段。
uj5u.com熱心網友回復:
onAuthStateChanged()每次用戶的身份驗證狀態更改時,觀察者都會運行,然后將set()覆寫現有檔案,洗掉任何現有資料。您可以嘗試使用merge不會洗掉其余欄位的選項,如下所示:
const docRef = doc(db, 'users', user.uid)
await setDoc(docRef, { food, quantity }, { merge: true })
然而,這仍然會用您提供的新值覆寫“食物”和“數量”陣列。因此,最好setDoc()在用戶在您的應用程式中注冊后僅使用一次,updateDoc然后再使用。
或者,您也可以取消訂閱偵聽器,如下所示:
const handleSubmit = async (e) => {
e.preventDefault();
const unsub = onAuthStateChanged(auth, async (user) => {
// process data
unsub();
})
}
如果在您的處理完成之前身份驗證狀態發生變化,處理程式可能仍會再次觸發。您應該onAuthStateChanged()在第一次加載 Web 應用程式時使用,然后根據用戶的身份驗證狀態將用戶重定向到不同的頁面。確認用戶已登錄后,您可以簡單地使用以下命令獲取當前用戶:
const user = auth.currentUser;
if (user) {
// update document.
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/510129.html
