用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’ }