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

使用Firebase动态键名存储用户选择月份报错求助

解决代码报错的方案

嘿,我一眼就发现问题所在啦!你这段代码的报错根源是对象字面量中动态属性名的语法错误,咱们一步步来修正:

问题分析

在saveUserToUsersRef方法里,你尝试直接用变量this.months[0].selectedOption作为对象的属性名,写法{ this.months[0].selectedOption : "test"}不符合JavaScript语法规范——JS会把this.months[0].selectedOption当成普通标识符,而不是动态变量,所以直接抛出语法错误。

修正方案

有两种常用的解决方式,根据你的环境选择即可:

方案1:ES6+计算属性名(推荐)

用方括号[]包裹变量,就能把它作为动态属性名使用,这是ES6引入的语法,现在大部分前端环境都支持:

saveInBdd (){ 
  this.errors = []; 
  const user = firebase.auth().currentUser; 
  user.updateProfile({ 
    displayName: this.firstname, 
  }).then(()=>{ 
    this.saveUserToUsersRef(user) 
  }, error => { 
    this.errors.push(error.message) 
  }) 
}, 
saveUserToUsersRef(user){
  // 用方括号包裹变量作为属性名
  return this.usersRef.child(user.uid).update({
    tab1: {
      [this.months[0].selectedOption]: "test"
    }
  })
}

方案2:ES5兼容写法(适配旧环境)

如果你的项目需要兼容不支持ES6的环境,可以先创建空对象,再动态添加属性:

saveInBdd (){ 
  this.errors = []; 
  const user = firebase.auth().currentUser; 
  user.updateProfile({ 
    displayName: this.firstname, 
  }).then(()=>{ 
    this.saveUserToUsersRef(user) 
  }, error => { 
    this.errors.push(error.message) 
  }) 
}, 
saveUserToUsersRef(user){
  const tab1Data = {};
  // 动态给对象添加属性
  tab1Data[this.months[0].selectedOption] = "test";
  return this.usersRef.child(user.uid).update({
    tab1: tab1Data
  })
}

额外优化建议

为了避免this.months[0]不存在或者selectedOption为空导致的潜在问题,建议加个简单的校验:

saveUserToUsersRef(user){
  const selectedMonth = this.months[0]?.selectedOption;
  if (!selectedMonth) {
    this.errors.push("请选择一个月份");
    return Promise.reject("未选择月份");
  }
  return this.usersRef.child(user.uid).update({
    tab1: {
      [selectedMonth]: "test"
    }
  }).catch(error => {
    this.errors.push(error.message);
    throw error; // 保留错误传递,方便后续处理
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:43:11