You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:37:43