Express+Mongoose项目POST创建数据库条目报500错误如何修复?
错误原因&修复方案
1. 直接导致ReferenceError: body is not defined的拼写错误
你在控制器app.post路由调用createExercise方法时存在两处语法问题:
- 错误写法:
exercises.createExercise(req.body.name, req.body.reps, req.body.weight, req.body.unit, req.body.unit, req,body.date) - 具体问题:
- 多传了一次
req.body.unit参数,createExercise方法仅需要5个入参(name、reps、weight、unit、date),你实际传了6个参数 - 最后一个参数把
req.body.date的属性访问符.错写成了逗号,,变成了req,body.date,JS会把body识别为独立变量,因此抛出未定义错误
- 多传了一次
- 修复后的post路由代码:
app.post('/exercises', (req, res) => { exercises.createExercise(req.body.name, req.body.reps, req.body.weight, req.body.unit, req.body.date) .then(exercise => { res.status(201).json(exercise); }) .catch(error => { console.error(error); res.status(400).json({ Error: 'Request failed' }); }); });
改完上述代码即可解决本次500报错,正常创建数据库条目。
其他潜在问题提前修复(避免后续测试其他接口报错)
2.1 模型层findExercises参数定义错误
你当前的写法没有声明filter、projection、limit三个入参,调用时会报变量未定义,修复:
const findExercises = async (filter, projection, limit) => { const query = Exercise.find(filter) .select(projection) .limit(limit) return query.exec(); }
2.2 模型层replaceExercise逻辑错误
- 你当前把所有字段都放在
replaceOne的过滤条件里,应该仅按_id过滤,第二个参数才是要替换的新数据 - 返回值属性名写错,正确属性是
modifiedCount不是nModifed
修复:
const replaceExercise = async(_id, name, reps, weight, unit, date) =>{ const result = await Exercise.replaceOne({_id: _id}, {name, reps, weight, unit, date}); return result.modifiedCount; }
2.3 删除方法名调用不统一
模型层导出的方法名是deletebyID,控制器里调用的是deleteById,大小写不一致,可修改模型层导出语句适配:
export {createExercise, findExercises, replaceExercise, deletebyID as deleteById };
2.4 控制器PUT路由返回值错误
put接口返回时错误从req.query取unit和date,应该从请求体req.body取值:
res.json({ _id: req.params._id, name: req.body.name, reps: req.body.reps, weight: req.body.weight, unit: req.body.unit, date: req.body.date })
内容的提问来源于stack exchange,提问作者310ToPoona
相关产品推荐
相关产品推荐

