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
其中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便可。