middleware - bodyparser

express4以前,bodyparser是express下的一個對象。javascript

express4把bodyparser分離出來。java

 

本文中的實例基於如下的這個請求node

$.ajax({
  url: '/save',
  type: 'post',
  data: {
    info: {
      nane: 'henry',
      age: 30
    },
    hobby: ['sport', 'coding']
  }
});

通常來講express在接收到這個請求時,收到的請求參數是這樣的ajax

app.post('/save', function(req, res, next){
  console.log(req.body);
  /* {'info[name]': 'henry', 'info[age]': '30', hobby[1]: 'sport', 'hobby[2]': 'coding'} */
});

顯然,這樣的數據是不能直接使用的。express

再看看使用bodyparser後的狀況json

app.use(bodyparser.urlencode());
app.post('/save', function(req, res, next){
  console.log(req.body);
  /* {'info': {'name': 'henry', 'age': '30'}, 'hobby': ['sport', 'coding']} */
});

bodyparser會將解析後的請求參數覆蓋到req.body, 後面的中間件能夠繼續訪問該屬性。app

 


 

常見的http請求的Content - type有如下幾種post

  • application/x-www-form-urlencoded 常見的form提交
  • multipart/form-data 文件提交
  • application/json 提交json格式的數據
  • text/xml 提交xml格式的數據
  • text/plain 提交純文本

其中bodyparser.urlencode中間件用於解析application/x-www-form-urlencoded的請求參數性能

bodyparser.json中間件用於解析application/json的請求參數url

 

另外,urlencode中間件有一個可配置的參數({extended: boolean});

這個參數爲真時,中間件將使用qs模塊解析請求參數,爲假時使用nodejs自帶的querystring來解析請求參數。

默認值是true。可是這個已經不被express官方推薦了。

 

來看看二者的區別

app.use(bodyparser.urlencode({extend: true}));
  /* 這也是默認配置 */
app.post('/save', function(req, res, next){
  console.log(req.body); 
  /* {'info': {'name': 'henry', 'age: '30'}, 'hobby': ['sport', 'coding']} */
});

另外一種狀況,使用querystring解析

app.use(bodyparser.urlencode({extended: false}));
app.post('/save', function(req, res, next){
  console.log(req.body);
  /* {'info[name]': 'henry', 'info[age]': '30', 'hobby[1]': 'sport', hobby[2]: 'coding'} */
});

能夠看出來querystring沒有很好的解析嵌套對象。因此,用qs來解析是比較合適。

可是qs自身也有涉及一些性能問題,致使解析對象的嵌套層數超過5層之後就不繼續解析了。

 

通常來講,jq的ajax方法默認配置和form表單提交所使用的Content - type

都是application/x-www-form-urlencoded,而且提交的數據也不會有很深的嵌套,

使用qs來解析就足夠了。可是若是非要上傳複雜嵌套的數據,能夠經過修改http請求的

Content-type 爲 application/json便可。

相關文章
相關標籤/搜索