未显式设置未处理Promise为何报错?axios post请求场景问题排查
问题原因与解决方案
你遇到的未处理Promise报错,本质是存在异步操作抛出异常但没有对应的catch逻辑捕获,具体问题点和修复方案如下:
- 核心问题:后端接口无任何HTTP响应返回
你的/api/addorder路由所有逻辑分支都没有调用res.json()/res.send()/res.end()这类返回响应的方法,HTTP协议要求每个请求必须有响应回执,SQL执行完成后前端的axios请求一直处于等待状态,超时后抛出的异常没有被正确捕获就会触发该报错。
你需要补充后端的响应返回逻辑,同时修复参数取值错误(前端传的是newRow字段,你之前取req.body.newOrder会得到undefined),参考修改后的代码:
app.post("/api/addorder", function (req, res) { // 修正参数取值 const newData = req.body.newRow; let newRecID = req.body.newRecID; sql.connect(config, function (err) { if (err) { console.log(err); // 返回连接错误响应 return res.status(500).json({msg: '数据库连接失败', error: err}); } var request = new sql.Request(); // 改用参数化查询避免SQL注入 request.input('recId', sql.Int, newRecID); request.query( 'INSERT INTO dbo.Einkauf_Web_Bestellungen_DEV (RecID) VALUES (@recId)', function (err, result) { if (err) { console.log(err); // 返回SQL执行错误响应 return res.status(500).json({msg: '数据插入失败', error: err}); } // 返回成功响应 res.json({msg: '插入成功', data: result}); } ); }); });
- 次要排查点:检查
getOrders方法的异常捕获
你在axios请求成功的回调中调用了getOrders方法,如果该方法内部存在异步逻辑但没有设置catch捕获错误,也会触发未处理的Promise rejection报错,建议给getOrders的异步操作补充异常捕获逻辑。 - 额外优化:你的SQL拼接写法存在严重的SQL注入风险,上述修改后的代码已经改为参数化查询的写法,建议在所有SQL操作中都使用参数化查询避免安全问题。
内容的提问来源于stack exchange,提问作者Lee Everett
相关产品推荐
相关产品推荐

