前言
最近尝试重新封装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-urlencoded
、application/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端口监听中...");
})
但是依旧获取不到!ÿ