express 解析 ajax post 数据 body 为空对象

当使用 jQuery AJAX 发送 POST 请求时,若前端设置 contentType 为 'application/json',Express 的 body-parser 无法正确解析,导致 body 为空对象。解决方案包括:1) 更改 Express 中的解析中间件为 'body-parser' 的 json 方式;2) 前端将 contentType 设置回 'application/x-www-form-urlencoded',并移除 JSON.stringify。了解不同 contentType 对应的后端解析方式对于前后端交互至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

前端使用 jquery 的 ajax 向后端发送 post 数据并携带参数,但是 express 解析的 body 为空对象。

代码:

使用 express 框架解析前端 post 的数据时


var express = require("express");
var bodyParser = require("body-parser");
var app = express();

app.use(bodyParser.urlencoded({ extended: false }));

app.post("/userName", (req, res) => {
  console.log(req.body);
  res.send("接受到了数据");
});

前端使用 jquery 的 ajax 进行传输数据

loginButton.addEventListener("click", (e) => {
	console.log("这里发送请求");
	$.ajax({
		type: "post",
        url: "/userName",
        contentType: "application/json",
        data: JSON.stringify({ userName: "xiaoming" }),
      }).done((msg) => {
        console.log("这里是返回内容", msg);
      });
    });

但是 express 解析到的前端 request 中的 body 为空对象。

原因是:

前端使用 jquery 的 ajax 进行 post 请求时,默认的 contentType 为:application/x-www-form-urlencoded

但是我在前端设置成了 application/json,即 ajax 在请求时会将用户携带的参数进行 json 形式的格式化。而后端解析 body: bodyParser.urlencoded({ extended: false }) 是解析 application/x-www-form-urlencoded 形式的参数的,因此后端解析出来的 body 为空对象。

解决方法:

方法一:
express 使用 app.use(bodyParser.json()); 替代 app.use(bodyParser.urlencoded({ extended: false })); 来解析 body

在这里插入图片描述

方法二:

前端设置contentType: application/x-www-form-urlencoded 并且删除data中的 JSON.stringify ,后端不改动还是 app.use(bodyParser.urlencoded({ extended: false })); 即可解析出 body。

在这里插入图片描述

contentType 中常见的选项有: application/x-www-form-urlencoded 、 application/json、text/xml 、 multipart/form-data 这些选项用于表明发送数据流的类型,后端根据类型进行对应的数据解析。

application/json 数据格式可以支持复杂情况,比如传输数据中对象中包含数组。
而如果用 appliacation/x-www-form-urlencoded 进行解析的话:会出现这种情况。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值