用ionic3写前端, express后台读取数据,但是
req.body
, req.params
, req.query
都没有数据,打印出来都是{}
原因:
—–之前:
在前端请求数据的时候, 使用的是request payload
—–后台
app.post('/user/add',function(req,res,next) {
console.log(req.body);
console.log(req.params);
console.log(req.query);
结果:
{}
{}
{}
—–之后
请求变成了,form-data
—–后台不变
结果:
{ username: ‘xl’, userpass: ‘xl’, minority: ‘0’ }
{}
{}
代码原因和改变:
let userUp = 'username=' + this.register.username +
'&userpass=' + this.register.userpass +
'&minority=' + (this.register.minority?0:1);
let userD = {username: this.register.username,
userpass: this.register.userpass,
minority: (this.register.minority?0:1) };
let headers = new HttpHeaders();
headers.append('Content-type', 'application/x-www-form-urlencoded');
let header = {
//headers: headers
headers: {'Content-type': 'application/x-www-form-urlencoded'}
};
let regFail = this.alertCtrl.create({
title: '用户注册失败',
buttons: [{text: '知道了', role: 'cancle'}]
});
this.http.post(this.url + 'user/add', userD , header).toPromise()
.then((res)=>{
console.log(res);
......
其中的:
let header = {
//headers: headers
headers: {'Content-type': 'application/x-www-form-urlencoded'}
};
PS: 这个HttpHeaders是angular新的header, 引用在
import { HttpClient, HttpHeaders } from '@angular/common/http';
可以点击这里查看API
总结:
1.使用headers: headers
的效果 就是 payload形式,后台无法用query,body,params读取数据。
2.使用 headers: {‘’Content-type': 'application/.....'}
传递数据就是form data形式, 用req.body获取数据。
我还没弄清楚为什么。。。搞死我了这个事情。(求大佬解答!!!)
附加一个问题是, 我搜了一下payload和form data的传输,说payload是原始的ajax请求,用流的方式进入。我试了一下网上说的监听流传输来获取传递的数据,然后console得到输出如下
test: == {"username":"xls","userpass":"xls","minority":0}
方法代码:
app.post('/user/add',function(req,res,next) {
//这三个都是没有输出的
console.log(req.body);
console.log(req.params);
console.log(req.query);
// 输出如上面的test....
var str = 'test: == ';
req.on('data', (dt)=>{
str += dt;
})
req.on('end', (dt)=>{
console.log(str);
})
});
然后你自己再转换一下。
最后,补充一个:ionic 进行post请求的时候,传递数据的方式不同,对结果有影响。 比如:
let userUp = 'username=' + this.register.username +
'&userpass=' + this.register.userpass +
'&minority=' + (this.register.minority?0:1);
let userD = {username: this.register.username,
userpass: this.register.userpass,
minority: (this.register.minority?0:1) };
this.http.post(this.url + 'user/add', userD , header).toPromise()......
用userD
和 userUp
后台 req.body
获取数据结果是不同的。直接用json的数据格式传递,在express获取数据的时候会给你再封装一次数据。你要捣腾两次。用类似get的方式(即&获取数据更方便)。
用userD: 结果(多封装了一层)
{ ‘{“username”:”23”,”userpass”:”43”,”minority”:0}’: ” }用userUp: 结果
{ username: ‘xl’, userpass: ‘xl’, minority: ‘0’ }