如何从 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 操作,它是同步的,因此不需要 awaitthen(应与 a同步操作).


进一步考虑

请注意,现在您只是在将费用写入服务器后才在本地显示费用。如果这是您的 use-case 的要求,那么 .但是在使用 Firebase 时,很常见的是:

  1. expenses 上使用永久 onValue 侦听器来显示 UI 中的最新支出。
  2. 在没有 then() 侦听器的情况下通过简单调用写入新费用:set(push(ref(db, "expenses")), expense);
  3. Firebase SDK 会立即使用新值调用本地 onValue 侦听器,假设写入会成功。
  4. 因此您的 UI 将立即显示本地值,几乎是即时响应给用户。
  5. 在服务器(即您的安全规则)拒绝写入操作的(更罕见的)情况下,SDK 会使用更正后的数据再次调用 onValue,因此您的 UI 可以更新状态。