Express无法通过req.body获取请求传递的数据

前言

最近尝试重新封装XMLHttpRequest,在发post请求的时候,发现express通过req.body获取不到数据,req.body打印出来是一个空对象。网上也试了网上各种办法,还是不成功,最后发现需要在XMLHttpRequest请求时设置一个请求头,来标识发送过去数据的类型。

1、问题描述

服务端代码如下:创建了一个/login请求,在控制台输出请求数据。

// 创建应用对象
const express = require('express');
const bodyParser = require('body-parser');
// 创建应用对象
const app = express();
app.use((req,res,next)=>{//针对跨域进行配置,允许任何源访问res.header('Access-Control-Allow-Origin', "*")next()
})// 创建路由规则
app.post("/login", (req,res) =>{// 输出req.bodyconsole.log("req.body:", req.body);res.send("login success")
})
// 监听端口启动服务
app.listen(8002,() => {console.log("服务已启动,8002端口监听中...");
}) 

前端代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><button id="login">登录</button><script> let dom = document.getElementById("login")url = "http://localhost:8002/login"
 dom.addEventListener("click",function(){let xml = new XMLHttpRequest()let data = {"username":"test","password":"123"}xml.onreadystatechange = function(){if(xml.readyState == 4){console.log(xml.responseText);}}xml.open("post", url , true)xml.send(JSON.stringify(data))}) </script>
</body>
</html> 

明明已经通过xml.send(JSON.stringify(data))已经将数据转换成json格式传到后端,我们可以打开network查看。

但是express中就是获取不到{"username":"test","password":"123"},控制台输出了一个空对象。

2、 解决办法

2.1 解决JSON内容格式

查了网上的教程,可以通过引入中间件'body-parser':它是一个HTTP请求体解析中间件,它用于解析客户端请求的body中的内容,如application/x-www-form-urlencodedapplication/json这两种常用的内容格式。

配置后代码如下:

// 创建应用对象
const express = require('express');
// 执行npm install body-parser之后再引入
const bodyParser = require('body-parser');
// 创建应用对象
const app = express();

// 处理application/json内容格式的请求体
app.use(bodyParser.json());

app.use((req,res,next)=>{//实验验证,只需要设置这一个就可以进行get请求res.header('Access-Control-Allow-Origin', "*")//配置8080端口跨域next()
})
// 创建路由规则
app.post("/login", (req,res) =>{// console.log(req);console.log("req.body:", req.body);res.send("login success")
})
// 监听端口启动服务
app.listen(8002,() => {console.log("服务已启动,8002端口监听中...");
}) 

但是依旧获取不到&#

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在 node.js 中使用 POST 请求,但是无法从 `req.body` 中获取数据,可能有几种原因。 1. 有正确地使用中间件 在使用 Express.js 等 web 框架时,需要使用中间件解析请求正文。如果有正确地使用中间件,`req.body` 将为空对象。 在 Express.js 中,你可以使用 `body-parser` 中间件解析请求正文。在你的应用程序中添加以下代码: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const app = express(); // 解析 application/json app.use(bodyParser.json()); // 解析 application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: true })); ``` 2. 请求的 Content-Type 不正确 如果请求的 Content-Type 不正确,`req.body` 将为空对象。请确保请求的 Content-Type 与你的中间件解析正文的类型匹配。 3. 请求体太大 默认情况下,Node.js 的 HTTP 模块限制请求正文大小为 100kb。如果请求正文超过此大小,则 `req.body` 将为空对象。 你可以通过在 `http.createServer` 函数中传递一个选项对象来更改此限制: ```javascript const server = http.createServer((req, res) => { // 增加限制为 1MB req.connection.setTimeout(1000 * 60 * 10); // 10 分钟 req.connection.setMaxListeners(50); req.on('data', chunk => { // 处理数据 }); }); ``` 以上是一些常见的原因,如果以上方法都无法解决问题,你可以尝试使用调试工具来检查请求和响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值