body-parser
body-parser中间件
body-parser 中间件是用来解析HTTP请求体的,是express默认使用的中间件之一
使用express应用生成器生成一个网站,它默认已经使用了bodyParser.json
与bodyParser.urlencoded
的解析功能,除此之外,bodyParser
还支持对text和raw的解析
使用中间件,就使用express下面的use方法
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.
我的理解是,此属性选项允许配置使用querystring(false)或者是qs(true)来解析数据默认是true,但是已经不赞成使用,querystring是nodejs内建的对象之一,用来字符串化一个对象或解析字符串
querystring.parse("name=henry&age=30") => { name: 'henry', age: '30' }
关于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' ]
}
可以看到当使用qs解析的时候,会将info对象(多级嵌套)进行识别并以对象的形式表达出来,但是querystring则没有这个功能
值得注意的是:对于多级嵌套的对象,qs只会解析5层嵌套,超出的部分会表现的跟文本头部的那种情况一样,并且qs最多只会解析20个索引,超出的部分将会以键值对的形式解析
更多详细的资料可以查阅:
body-parser qs
本文出处: xxKarina