向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
相关产品推荐
相关产品推荐

