Express+Node+MySQL MVC架构下CRUD插入接口报Cannot POST错误如何解决
问题排查与修复方案
核心问题1:路由路径不匹配(直接导致Cannot POST报错)
你Postman请求的地址是/api/insert,但当前代码的路由配置完全不匹配:
Index.js中给路由组配置了第一层前缀/insertRoutes.js中给插入接口又配置了第二层路径/insert- 最终实际生效的接口地址是
/insert/insert,且没有/api前缀,所以请求时返回404错误。 - 同时你还要确保Express已配置请求体解析中间件,否则无法获取
req.body参数。
核心问题2:Controller代码存在多处语法/逻辑错误
- 参数引用错误:函数入参是
req,代码中错误写成了request.body,request属于未定义变量 - 空对象判断逻辑错误:
req.body === Object判断永远不成立,必填校验无法触发 - 状态码设置语法错误:
res.send(400)是无效写法,需用res.status(400)设置状态码 - 重复响应风险:报错分支没有加
return,数据库出错时会同时发送两个响应,触发头信息重复设置报错
核心问题3:Model层错误传递逻辑错误
数据库插入出错时,你将错误信息放在了回调的第二个成功参数位置,Controller层的if(err)判断永远不会触发,无法正常捕获数据库报错。
对应修复步骤
1. 修复路由配置
修改Index.js的路由挂载逻辑,匹配你请求的/api前缀:
// 原代码:app.use('/insert', CarRoutes); // 替换为: app.use(express.json()); // 新增:解析json格式请求体,必须放在路由挂载前 app.use(express.urlencoded({ extended: true })); // 新增:解析表单格式请求体 app.use('/api', CarRoutes);
修改后接口路径就和你Postman请求的POST /api/insert完全一致。
2. 修复Controller.js代码
// 开头先引入CarModel,路径按你实际文件位置调整 const CarModel = require('./Model.js'); exports.createNewCar = (req, res) =>{ // 修复request为req const carReqData = new CarModel(req.body); console.log('carReqData', carReqData); // 修复空对象判断逻辑 if(Object.prototype.toString.call(req.body) === '[object Object]' && Object.keys(req.body).length === 0){ // 修复状态码写法,加return避免后续代码执行 return res.status(400).send({success: false, message: 'Please fill all fields'}); }else{ CarModel.createCar(carReqData, (err, car)=>{ if(err) // 加return避免重复响应 return res.send(err); res.json({status: true, message: 'Car Created Successfully', data: car.insertId}) }) } }
3. 修复Model.js代码
// 开头先引入数据库连接实例,路径按你实际配置调整 const db = require('./你的数据库配置文件路径'); var Car = function(car){ this.idCars = car.idCars; this.carName = car.carName; this.carModel = car.carModel; } Car.createCar = (carReqData, result) =>{ db.query('INSERT INTO Cars SET ?', carReqData, (err, res)=>{ if(err){ console.log('Error while inserting data', err); // 修复错误传递逻辑,把错误放在第一个参数位置 result(err, null); }else{ console.log('Car created successfully'); result(null, res) } }) } // 导出Car模型 module.exports = Car;
修复完成后重启服务即可正常调用插入接口。
内容的提问来源于stack exchange,提问作者user14407372
相关产品推荐
相关产品推荐

