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

使用Axios向Node.js服务器传参返回空对象的问题求助

问题原因

你的服务端仅配置了express.urlencoded中间件,它负责解析**表单格式(application/x-www-form-urlencoded)的请求体;但Axios默认会将JavaScript对象序列化为JSON格式(application/json)**发送,服务端没有对应解析JSON的中间件,因此req.body返回空对象。而直接通过表单提交时,浏览器默认发送表单格式数据,所以能正常解析。

两种解决方法

方法一:服务端添加JSON解析中间件

在现有express.urlencoded配置后,新增express.json()中间件,让服务端同时支持解析表单格式和JSON格式的请求体:

const app = express();
const path = require("path");

app.use(express.static('./public',{index:'form.html'}));

// 同时支持解析表单格式与JSON格式请求体
app.use(express.urlencoded({extended:true}));
app.use(express.json()); // 新增该行代码

app.post('/login',(req,res)=>{
  console.log('logged data: ',req.body);
  res.send('Thanks');
})

app.listen(8080, () => {
  console.log('server is running...in port 8080')
});

方法二:客户端发送表单格式数据

若不想修改服务端,可让Axios发送表单格式数据,以下两种方式任选其一:

方式A:直接传递FormData对象

无需将FormData转为普通对象,直接传给Axios即可,Axios会自动设置正确的请求头:

form.addEventListener("submit", (e) => {
  e.preventDefault();
  const formData = new FormData(form);

  axios
    .post("http://localhost:8080/login", formData)
    .then(function (response) {
      console.log(response.data);
    })
    .catch(function (error) {
      console.log(error);
    });
});

方式B:手动设置请求头并序列化对象

若要传递普通对象,需手动设置Content-Type为表单格式,并用URLSearchParams序列化对象:

form.addEventListener("submit", (e) => {
  e.preventDefault();
  const formData = new FormData(form);
  const formObject = {};
  formData.forEach((value, key) => {
    formObject[key] = value;
  });

  axios
    .post("http://localhost:8080/login", new URLSearchParams(formObject), {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      }
    })
    .then(function (response) {
      console.log(response.data);
    })
    .catch(function (error) {
      console.log(error);
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:42:45