0%

axios发送请求时后台接收的req.body为空

首先,先了解一下关于http协议里定义的四种常见数据的post方法,分别是:
application/www-form-ulrencoded
multipart/form-data
application/json
text/xml

Express依赖bodyParser对请求的包体进行解析。默认支持application/json,application/www-form-urlencoded,multipart/form-data.单数对xml没有支持。需要自己代码来实现

用axios post请求提交数据的时候需要清楚发送请求的类型是哪种,后台用相应的方法解析

1 使用FormData提交表单数据

坑一:使用FormData时一定要在先绑定submit事件,在submit事件触发时发送axios post请求,否则获取不到formData里面的值

坑二:axios请求里面如果直接使用data:formData,浏览器会自动帮我们加上 Content-Type: multipart/form-data ,因此请求要这样设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var form = document.getElementById("myForm");
// 用表单来初始化
var formData = new FormData(form);
// 我们可以根据name来访问表单中的字段
var username = formData.get("username"); // 获取名字
var password = formData.get("password"); // 获取密码
axios({
method:"post",
url:'http://127.0.0.1/api/login',
data:{
username:username,
password:password
}

})

这样默认Content-type:application/json,

如果表单属性过多,可以先用一个对象接收:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var form = document.getElementById("myForm");
// 用表单来初始化
var formData = new FormData(form);
// 我们可以根据name来访问表单中的字段
let myFormData={};
//如果表单属性过多可以先遍历
for(let pair of formData.entries()){
myFormData[pair[0]]=pair[1];
}
axios({
method:"post",
url:'http://127.0.0.1/api/login',
data:myFormData

})

后台接收使用中间件body-parser解析表单体数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
const express=require('express');
const session=require('express-session');
const cors=require('cors');
const bodyParser=require('body-parser')
const app=express();
app.use(cors());
app.use(
session({
secret:'xiaoqi',
resave:false,
saveUninitialized:true
})
)
//托管静态页面
app.use(express.static('./pages'));
//自定义解析Post提交过来的表单数据
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
//登录API接口
app.post('/api/login',(req,res)=>{
//判断用户提交的登录信息是否正确
//console.log(req.body)
if(req.body.username!=="admin"||req.body.password!=="888888"){
return res.send({status:1,msg:'登录失败'})
}
//登录成功则把信息存储在Session中
console.log(req.body);
req.session.user=req.body;//用户登录信息
req.session.islogin=true;//用户登录状态
res.send({status:0,msg:'登录成功'})

})
//获取用户姓名的接口
app.get('/api/username',(req,res)=>{
//从Session中获取用户姓名响应给客户端
if(!req.session.islogin){
return res.send({status:1,msg:'fail'})
}
res.send({
status:0,
msg:'success',
username:req.session.user.username,
})

})
//退出登录的接口
app.post('/api/logout',(req,res)=>{
//清空当前客户端的session信息
req.session.destroy()
res.send({
status:0,
msg:'退出登录成功'
})

})
app.listen(80,()=>{
console.log('运行在http://127.0.0.1')
})