如何在 React 中将 Firebase 实时数据库中的数据写入为 [自定义键:值]?

How to write data in Firebase Realtime Database as [custom key : value] in React?

我想要实现的是在 Firebase 实时数据库的专用节点中拥有随机 ID,同时能够在写入之前检查节点中是否已经存在 ID 以防止重复。
我正在使用 Web React (JavaScript)。

数据库目前是这样的:

我的目标是让另一个节点具有以下格式的 ID:

注意:在'users'节点中生成的ID与在'ids'中生成的ID不同,它们没有连接。

[key : value] 对中的 ID 键,例如 'abcd',不应由 Firebase 生成(如 push() 方法那样)。
相反,ID 是在写入数据之前单独生成的。

到目前为止,我发现了一些具有类似问题的资源,但它们要么与具有另一种语法的不同平台相关,要么已过时。

我当前从 'ids' 节点读取 ID 的代码似乎可以正常工作,如果带有 ID 的节点是在数据库控制台中手动创建的,但看来我仍然需要代码写入数据方面的帮助以所需的格式。

这是读取数据的代码:

function checkIdDuplicity(id)
{
    const database = getDatabase();

    get(child(ref(database), 'ids/'))
     .then((snapshot) => {
        if (snapshot.exists()) {
            // Snapshot exists, find possible duplicate
            if (snapshot.hasChild(id)) {
                // Such ID is already in database
                console.log("ID already exists");
                return true;
            }
            else {
                // ID is unique
                return false;
            }
        }
        else {
            // No IDs in database, node shall be created
            return false;
        }
     })
     .catch((error) => {
        console.log(error);
     });
}

有人有什么想法吗?

要添加带有自定义键的节点,您需要使用 set() 而不是 push()

const nodeRef = child(ref(database), "ids/" + id); // id = custom ID you want to specify 

await set(nodeRef, { ...data })

此外,您正在下载整个 ids/ 节点以检查给定 ID 是否存在。相反,您可以只下载该特定 ID:

// specify the custom ID to check for in ref
get(child(ref(database), 'ids/' + id)) .then((snapshot) => {
  if (snapshot.exists()) {
    console.log("ID already exists in database")
  } else {
    console.log("ID does not exist in database")
  }
})