我試圖在設定該物件后獲取該物件的 ID。但我收到型別錯誤。TypeError:無法讀取未定義的屬性(讀取“val”)。我應該如何使用 firebase 9 做到這一點?
這是我想要作業的代碼:
set(push(ref(db, "expenses")), expense)
.then((snapshot) => {
console.log(snapshot.val());
dispatch(
addExpense({
id: snapshot.key,
...expense,
})
);
})
.catch((e) => {
console.log("This failed.", e);
});
提前致謝。
uj5u.com熱心網友回復:
為什么你的代碼不起作用
set(ref, value)的檔案顯示定義為:
function set(ref: DatabaseReference, value: unknown): Promise<void>
它回傳 a Promise<void>,所以沒有snapshot被傳遞給你 then 。
如果 Promise 解決(因此您的then回呼被呼叫),expense則按原樣寫入服務器上的資料庫。
如何修復它
如果您想獲取push呼叫的密鑰,您可以在set呼叫之外捕獲它:
const newRef = push(ref(db, "expenses"));
set(newRef, expense)
.then(() => {
dispatch(
addExpense({
id: newRef.key,
...expense,
})
);
})
.catch((e) => {
console.log("This failed.", e);
});
呼叫push是一個純客戶端操作,這是同步的,以便不需要await或then(其應與使用一個同步操作)。
進一步的考慮
請注意,現在您只在將費用寫入服務器后在本地顯示費用。如果這是您的用例的要求,那么 ??。但是在使用 Firebase 時,很常見的是:
- 使用永久的
onValue監聽器在expensesUI 中顯示最新的費用。 - 通過一個簡單的呼叫撰寫新的費用,無需
then()監聽器:set(push(ref(db, "expenses")), expense); - 然后 Firebase SDK 將立即
onValue使用新值呼叫本地偵聽器,并假設寫入會成功。 - 因此,您的 UI 將立即顯示本地值,為用戶提供幾乎即時的回應。
- 在服務器(即您的安全規則)拒絕寫入操作的(更不常見的)情況下,SDK
onValue會使用更正的資料再次呼叫,因此您的 UI 可以更新狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420634.html
標籤:
