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

向Firebase数据库添加支出时遇NaN及权限拒绝错误求助

解决Firebase添加支出时的NaN属性错误与权限拒绝问题

嘿,你遇到的这两个问题其实是有关联的,咱们一步步来排查解决:

一、先搞定「Reference.push failed: first argument contains NaN」错误

这个错误的原因非常明确:你要推送到Firebase的支出数据里,users.mzsNqPucvWZMWuyo4sThlMqyR1k2.expenses.km字段的值是NaN(非数字),而Firebase实时数据库只接受合法的JSON数据类型,NaN是不被允许存储的。

解决步骤:

  • 追踪km字段的来源:检查你构建支出数据的代码,看看km的值是怎么生成的——是不是用户输入的字符串没转成数字?或者计算时出现了除以0、空值转换的情况?
  • 强制转换并校验:确保km是有效的数字,比如用parseFloat()转换后,判断是否为NaN,如果是的话给个默认值(比如0)。举个代码例子:
// 假设inputKm是用户输入的内容
const km = parseFloat(inputKm);
const expenseData = {
  km: isNaN(km) ? 0 : km,
  // 其他支出字段(比如金额、日期等)
};
  • 推送前做校验:在调用push()之前,先检查数据里有没有NaN,避免无效请求:
if (Object.values(expenseData).some(val => isNaN(val))) {
  console.error("支出数据包含非法的NaN值,请检查!");
  return; // 终止推送操作
}

// 确认数据合法后再推送
firebase.database().ref(`users/${currentUserId}/expenses`).push(expenseData);

二、再解决「permission_denied」权限拒绝警告

虽然你设置了.read和.write规则,但还是触发了权限拒绝,可能的原因有这些:

  • 规则没正确部署:修改Firebase规则后,一定要点击控制台规则页面的「发布」按钮,否则旧规则还在生效。比如你可以先测试宽松的规则(注意生产环境要改回严格规则):
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
  • 用户未正确认证:如果你的规则要求auth.uid匹配当前用户ID,那必须确保用户已经完成登录。可以在推送前检查用户状态:
const currentUser = firebase.auth().currentUser;
if (!currentUser) {
  console.error("用户未登录,无法修改数据!");
  return;
}
// 确认用户ID和数据库路径里的UID一致
console.log("当前用户ID:", currentUser.uid); // 和报错里的mzsNqPucvWZMWuyo4sThlMqyR1k2对比
  • 路径拼写错误:检查你推送的数据库路径是否正确,确保users下的UID和当前登录用户的UID完全一致,有没有大小写或者字符错误。
  • 先解决NaN错误再测试:有时候前面的数据验证失败,会导致后续的请求异常,先把NaN的问题解决后,再测试权限是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:15