如何从 firebase 获取对象的 ID
How to get id of an object from firebase
我试图在设置对象后获取该对象的 ID。但是我收到类型错误。类型错误:无法读取未定义的属性(读取 '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);
});
提前致谢。
为什么你的代码不起作用
set(ref, value) 的文档显示它被定义为:
function set(ref: DatabaseReference, value: unknown): Promise<void>
它 returns 一个 Promise<void>
,所以没有 snapshot
传递给你的 then。
如果承诺解决(因此您的 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
是纯 client-side 操作,它是同步的,因此不需要 await
或 then
(应与 a同步操作).
进一步考虑
请注意,现在您只是在将费用写入服务器后才在本地显示费用。如果这是您的 use-case 的要求,那么 .但是在使用 Firebase 时,很常见的是:
- 在
expenses
上使用永久 onValue
侦听器来显示 UI 中的最新支出。
- 在没有
then()
侦听器的情况下通过简单调用写入新费用:set(push(ref(db, "expenses")), expense);
- Firebase SDK 会立即使用新值调用本地
onValue
侦听器,假设写入会成功。
- 因此您的 UI 将立即显示本地值,几乎是即时响应给用户。
- 在服务器(即您的安全规则)拒绝写入操作的(更罕见的)情况下,SDK 会使用更正后的数据再次调用
onValue
,因此您的 UI 可以更新状态。
我试图在设置对象后获取该对象的 ID。但是我收到类型错误。类型错误:无法读取未定义的属性(读取 '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);
});
提前致谢。
为什么你的代码不起作用
set(ref, value) 的文档显示它被定义为:
function set(ref: DatabaseReference, value: unknown): Promise<void>
它 returns 一个 Promise<void>
,所以没有 snapshot
传递给你的 then。
如果承诺解决(因此您的 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
是纯 client-side 操作,它是同步的,因此不需要 await
或 then
(应与 a同步操作).
进一步考虑
请注意,现在您只是在将费用写入服务器后才在本地显示费用。如果这是您的 use-case 的要求,那么 .但是在使用 Firebase 时,很常见的是:
- 在
expenses
上使用永久onValue
侦听器来显示 UI 中的最新支出。 - 在没有
then()
侦听器的情况下通过简单调用写入新费用:set(push(ref(db, "expenses")), expense);
- Firebase SDK 会立即使用新值调用本地
onValue
侦听器,假设写入会成功。 - 因此您的 UI 将立即显示本地值,几乎是即时响应给用户。
- 在服务器(即您的安全规则)拒绝写入操作的(更罕见的)情况下,SDK 会使用更正后的数据再次调用
onValue
,因此您的 UI 可以更新状态。