AJAX发送GET请求至Express未被接收问题求助(附前后端代码)
解决AJAX GET请求无法被Express接收的问题
看起来你遇到的核心问题是GET请求不支持通过req.body获取参数,这是HTTP规范决定的——GET请求的参数应该放在URL的查询字符串或者路径参数里,而不是请求体中。结合你给出的代码,我帮你梳理下问题和解决方案:
问题分析
你的后端Express路由用了GET方法,但却试图读取req.body.approve,这肯定拿不到值,甚至可能导致请求处理逻辑异常,最终让你觉得“请求没被接收”。另外,如果你没配置请求体解析中间件,就算是POST请求也会拿不到req.body。
解决方案
这里给你两种可行的修改方案,根据你的需求选择:
方案一:改用POST请求(推荐,因为涉及状态修改)
既然你要更新请假的审批状态,用POST请求更符合REST规范。修改如下:
后端代码修改
// 把router.get改成router.post router.post('/principal/leave/approval/:id', function(req, res) { console.log('requested'); // 更简洁的方式判断审批状态 const approval = Boolean(req.body.approve); leaveDB.update({ _id: req.params.id }, { approved: approval }, function(err) { if (err) { console.log(err); // 记得返回错误状态码,方便前端处理 return res.status(500).send('更新失败'); } res.send('success'); }); });
同时,确保你的Express应用已经配置了解析请求体的中间件(这一步很重要!):
const express = require('express'); const app = express(); // 解析JSON格式的请求体 app.use(express.json()); // 解析表单格式的请求体(如果前端用form-data的话) app.use(express.urlencoded({ extended: true }));
前端AJAX示例(假设用jQuery)
// 绑定Approve按钮点击事件 $('.btn<%=details._id%>#Approve').click(function() { const leaveId = '<%=details._id%>'; $.ajax({ url: `/principal/leave/approval/${leaveId}`, type: 'POST', data: JSON.stringify({ approve: true }), // 传递审批状态 contentType: 'application/json', success: function(response) { console.log('审批成功:', response); // 这里可以添加页面刷新或提示逻辑 }, error: function(xhr) { console.log('请求失败:', xhr.responseText); } }); }); // Disapprove按钮同理,只需要把approve改成false $('.btn<%=details._id%>#Disapprove').click(function() { const leaveId = '<%=details._id%>'; $.ajax({ url: `/principal/leave/approval/${leaveId}`, type: 'POST', data: JSON.stringify({ approve: false }), contentType: 'application/json', success: function(response) { console.log('驳回成功:', response); }, error: function(xhr) { console.log('请求失败:', xhr.responseText); } }); });
方案二:继续用GET请求,把参数放在URL查询字符串里
如果一定要用GET,那需要把approve参数放在URL的查询部分,后端通过req.query获取:
后端代码修改
router.get('/principal/leave/approval/:id', function(req, res) { console.log('requested'); // GET参数是字符串类型,所以要转成布尔值 const approval = req.query.approve === 'true'; leaveDB.update({ _id: req.params.id }, { approved: approval }, function(err) { if (err) { console.log(err); return res.status(500).send('更新失败'); } res.send('success'); }); });
前端AJAX示例
$('.btn<%=details._id%>#Approve').click(function() { const leaveId = '<%=details._id%>'; $.ajax({ url: `/principal/leave/approval/${leaveId}?approve=true`, type: 'GET', success: function(response) { console.log('审批成功:', response); }, error: function(xhr) { console.log('请求失败:', xhr.responseText); } }); }); $('.btn<%=details._id%>#Disapprove').click(function() { const leaveId = '<%=details._id%>'; $.ajax({ url: `/principal/leave/approval/${leaveId}?approve=false`, type: 'GET', success: function(response) { console.log('驳回成功:', response); }, error: function(xhr) { console.log('请求失败:', xhr.responseText); } }); });
额外检查点
- 确认前端AJAX的URL路径和后端路由完全匹配,有没有拼写错误;
- 如果是跨域请求,需要在Express中配置CORS中间件;
- 打开浏览器的开发者工具(F12),查看Network面板,确认请求是否真的发送出去,以及请求的状态码和响应内容。
内容的提问来源于stack exchange,提问作者Dilan Sachintha Nayanajith
相关产品推荐
相关产品推荐

