MERN博客项目Axios GET请求传参为空问题排查与解决
解决MERN博客中Axios GET请求参数无法传递的问题
刚踩过类似的坑!问题的核心在于GET请求不应该通过Request Body传递参数——虽然HTTP标准没有完全禁止这种操作,但包括Express在内的大多数后端框架默认不会解析GET请求的Body,而且这也不符合RESTful的最佳实践,生产环境中还可能遇到CDN、代理服务器忽略GET Body的兼容性问题。
你的问题复盘
你用Postman测试接口正常是因为Postman允许给GET请求手动添加Body,但这种方式并不规范。当你用Axios发起GET请求时:
- 客户端用
data字段传递userId,但这个参数不会被正确传递到服务端 - 服务端从
req.body取值,自然拿到空对象
具体解决步骤
1. 客户端修改:用params替代data传参
Axios的GET请求中,params字段会自动把参数拼接到URL的查询字符串中(比如/api/blogs?userId=xxx),这是GET请求传递筛选参数的标准方式。修改后的代码:
const sensorResponse = await axios({ method: 'get', url: url, headers: { "x-auth-token": localStorage.getItem('auth-token'), "content-type": "application/json" }, params: { 'userId': user.id } })
如果喜欢用Axios的简写语法,注意参数顺序(第二个参数是配置对象,包含params和headers):
const blogResponse = await axios.get(url, { params: { userId: user.id }, headers: { "x-auth-token": localStorage.getItem('auth-token'), "content-type": "application/json" } })
2. 服务端修改:从req.query获取参数
Express会自动解析URL中的查询字符串,并把参数存入req.query对象,所以把原来从req.body取值的逻辑改成从req.query获取:
router.get('/', auth, async (req,res)=>{ const userId = req.query.userId; console.log(userId) const blogs= await Blog.find({userId:userId}) res.json(blogs) })
额外提醒
以后写GET请求时,尽量用查询参数传递筛选、分页这类参数;POST/PUT请求才用Body传递需要提交的数据,这样既符合规范,也能避免类似的兼容性问题。
内容的提问来源于stack exchange,提问作者barteg
相关产品推荐
相关产品推荐

