bodyParser中间件的研讨
打仗nodejs已有一段时间了,但近来才最先落实项目,因而运用express运用天生器天生了一个运用。开辟过程当中发明ajax提交的数据没法被express准确的剖析,重要的状况是如许的:
// 浏览器端post一个对象
$.ajax({
url: "/save",
type: "post",
data: {
name: "henry",
age: 30,
hobby: [ "sport", "coding" ]
}
});
// express吸收这个对象
router.post("/save", function (req, res, next) {
console.log(req.body); // => { 'info[name]': 'henry','info[age]': '30','hobby[1]': 'sport','hobby[2]': 'coding' }
});
明显如许的剖析结果是不能直接拿来用的,稀里糊涂的一个坑,困了我好久。
bodyParser中间件
bodyParser中间件用来剖析http要求体,是express默许运用的中间件之一。
运用express运用天生器天生一个网站,它默许已运用了 bodyParser.json
与 bodyParser.urlencoded
的剖析功用,除了这两个,bodyParser还支撑对text、raw的剖析。
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
望文生义,bodyParser.json是用来剖析json数据花样的。bodyParser.urlencoded则是用来剖析我们一般的form表单提交的数据,也就是要求头中包括如许的信息: Content-Type: application/x-www-form-urlencoded
罕见的四种Content-Type范例:
application/x-www-form-urlencoded
罕见的form提交multipart/form-data
文件提交application/json
提交json花样的数据text/xml
提交xml花样的数据
细致解读 urlencoded
bodyParser.urlencoded
模块用于剖析req.body的数据,剖析胜利后掩盖本来的req.body,假如剖析失利则为 {}
。该模块有一个属性extended,官方引见以下:
The extended option allows to choose between parsing the URL-encoded data with the querystring library (when false) or the qs library (when true). Defaults to true, but using the default has been deprecated.
大抵的意义就是:extended选项许可设置运用querystring(false)或qs(true)来剖析数据,默许值是true,但这已是不被赞同的了。
querystring就是nodejs内建的对象之一,用来字符串化对象或剖析字符串。如
querystring.parse("name=henry&age=30") => { name: 'henry', age: '30' }
那末,既然querystring已能完成对urlencode的剖析了,为何还需要qs?qs又是什么?
qs引见
qs是一个querystring的库,在qs的功用基础上,还支撑更多的功用并优化了一些安全性。比方,对象剖析的支撑:
// 内建对象 querystring
querystring.parse("info[name]=henry&info[age]=30&hobby[1]=sport&hobby[2]=coding") =>
{
'info[name]': 'henry',
'info[age]': '30',
'hobby[1]': 'sport',
'hobby[2]': 'coding'
}
// 第三方插件 qs
qs.parse("info[name]=henry&info[age]=30&hobby[1]=sport&hobby[2]=coding") =>
{
info: {
name: 'henry',
age: '30'
},
hobby: [ 'sport', 'coding' ]
}
能够看出,querystring并不能准确的剖析庞杂对象(多级嵌套),而qs却能够做到。
然则qs也不是全能的,关于多级嵌套的对象,qs只会剖析5层嵌套,超越的部份会表现的跟本文头部的那种状况一样;关于数组,qs最大只会剖析20个索引,超越的部份将会以键值对的情势剖析。
作为一个中间件,qs必需要为机能斟酌,才会有云云多的限定,express也默许运用qs来剖析要求体。
理论上来讲,form表单提交不会有多级嵌套的状况,而urlencoded自身也是form的内容范例,因而,bodyParser.urlencoded不支撑多级嵌套也是很合理的设想。
那末,假如我们非要上传一个十分庞杂的对象,应当怎么办?
处理方案
涌现这个题目的基础原因是:我以form的情势去提交了一个json数据。
jquery默许的 content-Type
设置的是 application/x-www-form-urlencoded
,
因而变动ajax要求参数:contentType: "application/json"
,并将数据转成json提交,题目就处理了。
// 浏览器端post一个对象
$.ajax({
url: "/save",
type: "post",
contentType: "application/json",
data: JSON.stringify({
name: "henry",
age: 30,
hobby: [ "sport", "coding" ]
})
});
// express吸收这个对象
router.post("/save", function (req, res, next) {
console.log(req.body); // => { name: 'henry', age: 30, hobby: [ 'sport', 'coding' ] }
});
参考资料
大多时刻,我们只知道怎样去运用,而不知道为何这么用。