Node.js中HTTP 405错误排查:数据库更新请求遭客户端拦截
Node.js HTTP 405错误及相关问题修复
问题核心成因
- 路由路径配置错误:POST请求无法匹配到对应处理路由,触发405 Method Not Allowed错误
- 请求字段不匹配:客户端发送的字段名与服务器接收逻辑不一致
- 未返回响应:数据库操作完成后未向客户端返回响应,请求挂起
- SQL注入风险:直接拼接SQL语句存在安全隐患
分步修复方案
1. 修正路由路径(ups.js)
原代码中路由路径使用相对路径./routes/ups错误,需改为根路径下的/ups(因index.js已通过app.use挂载该路由模块):
// ups.js 路由定义修正 router.post("/ups", async (req, res) => { // 原有逻辑保持,仅修改路由路径 });
2. 统一请求字段名
客户端发送的payload字段为available,但服务器中用req.body.av接收,导致校验失败。需同步字段名:
// ups.js 字段校验与接收修正 if( req.body == null || req.body.id == null || req.body.available == null // 改为available ) { return res.status(StatusCodes.BAD_REQUEST).json({ status: StatusCodes.BAD_REQUEST, title: ReasonPhrases.BAD_REQUEST, data: { error: "Invalid data provided" } }); } var id = req.body.id; var av = req.body.available; // 改为available
3. 补充响应返回逻辑
数据库操作完成后未返回响应,导致请求一直挂起。需在回调中添加响应:
// ups.js 数据库操作回调修正 db.query(sql, function(err, result) { if (err) { console.error(err); return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ status: StatusCodes.INTERNAL_SERVER_ERROR, title: ReasonPhrases.INTERNAL_SERVER_ERROR, data: { error: "Database operation failed" } }); } console.log('record updated'); // 修正日志描述(是update不是insert) console.log(req.body.id); console.log(req.body.available); return res.status(StatusCodes.OK).json({ status: StatusCodes.OK, title: ReasonPhrases.OK, data: { message: "Record updated successfully" } }); });
4. 修复SQL注入风险
直接拼接SQL语句存在安全隐患,改用参数化查询:
// ups.js SQL语句修正为参数化查询 var sql = "UPDATE `pc_status` SET available = ? WHERE `id` = ?"; db.query(sql, [av, id], function(err, result) { // 原有回调逻辑 });
5. 关于res.redirect的历史错误
之前出现的"无法在发送响应头后设置头"错误,是因为res.redirect会发送响应头,若在异步操作中调用时,可能已存在其他响应输出导致冲突。目前注释后该问题已解决,后续使用需确保一次请求仅发送一次响应。
客户端代码适配
客户端原逻辑判断201状态码,修复后服务器返回200 OK,需调整判断:
// script.js 状态码判断修正 .then((data) => { if(data.status == 200) { // 改为200 console.log("Good!"); } else { console.log("Error occured"); console.log(data); } })
内容的提问来源于stack exchange,提问作者MEAries
相关产品推荐
相关产品推荐

