補充: ionic-post的payload和form-data請求,nodejs express讀取數據問題

用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()......

userDuserUp 後臺 req.body獲取數據結果是不同的。直接用json的數據格式傳遞,在express獲取數據的時候會給你再封裝一次數據。你要搗騰兩次。用類似get的方式(即&獲取數據更方便)。

  1. 用userD: 結果(多封裝了一層)
    { ‘{“username”:”23”,”userpass”:”43”,”minority”:0}’: ” }

  2. 用userUp: 結果
    { username: ‘xl’, userpass: ‘xl’, minority: ‘0’ }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章