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

Node.js/Express项目POST接口测试时Firebase Reference.set报错排查

问题排查与修复方案

嘿,我帮你找到了错误的根源!你遇到的Reference.set failed错误,是因为表单提交的字段名称和后端代码里接收的字段名称不匹配,导致req.body里的部分属性值为undefined——而Firebase的set()方法不允许传入包含undefined的对象。具体来看有两处明显的不匹配:


1. 描述字段的拼写错误

  • 在你的add.ejs表单里,描述字段的name属性是正确的description:
    <input type="text" class="form-control" name="description" placeholder="Description">
    
  • 但在workout.js的POST路由中,你把字段名写成了discription(少了一个字母e):
    discription: req.body.discription,
    
    这就导致req.body.discription根本取不到值,结果就是undefined。

2. 组数字段的单复数不匹配

  • 表单里组数字段的name是复数形式sets:
    <input type="text" class="form-control" name="sets" placeholder="Number of sets">
    
  • 但后端代码里你用了单数set去接收:
    set: req.body.set,
    
    同样,req.body.set也是undefined。

另外,错误提示里提到的name字段问题,可能是某次测试时你没填写这个字段导致的,所以也建议加上基础的字段验证,避免用户空提交。


修复后的代码示例

先修正workout.js的POST路由:

router.post('/add', function(req,res,next) {
 // 让字段名和表单完全匹配
 var workout = {
 name: req.body.name,
 description: req.body.description, // 修正拼写错误
 sets: req.body.sets, // 改为和表单一致的复数形式
 repsTime: req.body.repsTime
 }

 // 新增简单的后端验证,防止空值提交
 if (!workout.name || !workout.description || !workout.sets || !workout.repsTime) {
 req.flash('error_msg', '请填写所有必填字段!');
 return res.redirect('/workouts/add');
 }

 firebase.database().ref().child('workouts').push().set(workout);
 req.flash('success_msg', 'Workout saved');
 res.redirect('/workouts');
});

(可选)给表单加上前端必填验证

修改add.ejs里的输入框,加上required属性,从前端层面避免空提交:

<form method="post" action="/workouts/add">
 <div class="form-group">
 <label>Exercise</label>
 <input type="text" class="form-control" name="name" placeholder="Workout Name" required>
 <label>Description</label>
 <input type="text" class="form-control" name="description" placeholder="Description" required>
 <label>Set</label>
 <input type="text" class="form-control" name="sets" placeholder="Number of sets" required>
 <label>RepsTime</label>
 <input type="text" class="form-control" name="repsTime" placeholder="Number of repsTime" required>
 </div>
 <button type="submit" class="btn btn-default">Submit</button>
 <a class="btn btn-danger" href="/workouts">Close</a>
</form>

这样修改后,字段名称完全匹配,再加上前后端的双重验证,就能彻底解决这个Firebase的错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:49