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

React新手搭建MERN栈:React Native前端向Express后端传参失败(请求体为空)求助

解决React Native向Express后端传值时请求体为空的问题

嘿,我一眼就看出问题所在了——你用GET请求来传递请求体,但HTTP规范里GET请求是不支持携带请求体的!这就是为什么后端打印req.body是空对象的原因。下面给你两种实用的解决办法,选哪种看你的场景需求:

方案一:改用POST请求(推荐,适合传递数据的场景)

POST请求是专门用来提交数据的,能正常携带请求体。只需要修改前端的请求方法和后端的路由方法,同时别忘了确保Express配置了解析JSON请求体的中间件。

修改后的前端Hook代码

const fetchUser = (dispatch) => {
  return async () => {
    const email = await AsyncStorage.getItem("email");
    console.log("async email:", email);
    try {
      console.log("sending email:", email);
      // 把get请求改成post请求,请求体参数不变
      const userInfo = await trackerApi.post("/users", { email });
      dispatch({ type: "fetch_users", payload: userInfo.data });
    } catch (err) {
      console.log(err);
    }
  };
};

修改后的Express后端代码

// 重要!先确保你在Express的主入口文件(比如app.js)里配置了这个中间件,否则解析不了JSON请求体
// app.use(express.json());

router.post("/users", async (req, res) => { // 把get路由改成post路由
  console.log("Request Body:", req.body);
  try {
    const { email } = req.body;
    const user = await User.find({ email });
    console.log("Users for req: ", user);
    res.send(user);
  } catch (err) {
    console.log(err);
    res.status(500).send("服务器错误"); // 建议给错误返回对应的HTTP状态码
  }
});

方案二:继续用GET请求,通过URL查询参数传递数据

如果坚持要用GET(比如这个请求只是获取数据,没有修改操作),可以把email放在URL的查询参数里,后端从req.query中获取值。

修改后的前端Hook代码

const fetchUser = (dispatch) => {
  return async () => {
    const email = await AsyncStorage.getItem("email");
    console.log("async email:", email);
    try {
      console.log("sending email:", email);
      // 用params字段传递查询参数,axios会自动拼到URL后面(比如/users?email=xxx@xxx.com)
      const userInfo = await trackerApi.get("/users", { params: { email } });
      dispatch({ type: "fetch_users", payload: userInfo.data });
    } catch (err) {
      console.log(err);
    }
  };
};

修改后的Express后端代码

router.get("/users", async (req, res) => {
  console.log("Request Query:", req.query); // 现在看query对象就能拿到email了
  try {
    const { email } = req.query; // 从req.query中提取,而不是req.body
    const user = await User.find({ email });
    console.log("Users for req: ", user);
    res.send(user);
  } catch (err) {
    console.log(err);
    res.status(500).send("服务器错误");
  }
});

额外注意点

  • 用POST方案时,必须配置express.json()中间件,否则Express无法解析JSON格式的请求体,req.body还是会为空。
  • 用查询参数方案时,如果email包含特殊字符(比如@、.),axios会自动帮你URL编码,不用手动处理。

内容的提问来源于stack exchange,提问作者Evo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:50:20