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
相关产品推荐
相关产品推荐

