You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase数据库添加用户名集合:如何设置动态唯一键

解决Firebase动态键存储的问题

嘿,我来帮你搞定这个Firebase数据存储的问题!咱先说说你原代码里的两个小坑:

  1. 你用了{ user: 1 },这里的user是对象的字面量键名,不是变量,所以不管循环多少次,键都会是固定的"user";
  2. 循环里每次调用set()会直接覆盖games/users节点下的所有数据,最后只会剩下最后一个用户的数据。

针对你想要的两种动态键方案,我分别给你写代码示例:

方案一:用递增数字作为键(比如1: "Max", 2: "Jane")

你可以利用forEach的第二个参数(索引)来生成递增数字,注意要用计算属性名把变量值作为键,同时推荐先构建完整对象再一次性写入,比循环里逐个更新更高效:

// 方法1:先构建完整对象,一次性写入
const usersObj: { [key: number]: string } = {};
this.addedUsers.forEach((user, idx) => {
  // idx从0开始,+1让键从1开始递增
  usersObj[idx + 1] = user;
});
firebase.database().ref("games").child("users").set(usersObj);

如果你非要在循环里逐个添加,那就用update()而不是set(),避免覆盖:

let currentIndex = 1;
this.addedUsers.forEach((user: string) => {
  const gameUsersRef = firebase.database().ref("games").child("users");
  // 计算属性名[index]会把currentIndex的数值作为键
  gameUsersRef.update({ [currentIndex]: user });
  currentIndex++;
});

方案二:使用数据库中已存储的用户键作为键

假设你的用户数据已经存在Firebase的/users节点(比如结构是userKey: "用户名"),你需要先建立用户名到用户键的映射,再写入games/users:

情况1:已经有用户名到用户键的映射

// 假设你已经从数据库或其他地方拿到了这个映射
const userKeyMap: { [name: string]: string } = {
  "Max": "user_abc123",
  "Jane": "user_def456",
  "Joe": "user_ghi789"
};

const gameUsersObj: { [key: string]: string } = {};
this.addedUsers.forEach(user => {
  const userKey = userKeyMap[user];
  if (userKey) { // 确保存在对应的用户键,避免报错
    gameUsersObj[userKey] = user;
  }
});

firebase.database().ref("games").child("users").set(gameUsersObj);

情况2:需要先从数据库获取用户键映射

如果还没有映射,先从/users节点读取数据再构建:

firebase.database().ref("users").once("value")
  .then(snapshot => {
    const userKeyMap: { [name: string]: string } = {};
    snapshot.forEach(childSnap => {
      const userName = childSnap.val();
      userKeyMap[userName] = childSnap.key; // 把用户名和对应的用户键存起来
    });

    // 构建要写入的对象
    const gameUsersObj: { [key: string]: string } = {};
    this.addedUsers.forEach(user => {
      const userKey = userKeyMap[user];
      if (userKey) {
        gameUsersObj[userKey] = user;
      }
    });

    // 写入到games/users节点
    return firebase.database().ref("games").child("users").set(gameUsersObj);
  })
  .catch(error => {
    console.error("获取用户键失败:", error);
  });

这样就能实现你想要的动态键存储啦!

内容的提问来源于stack exchange,提问作者parvaneh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:10:48