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

