设为首页 收藏本站
查看: 1499|回复: 0

[经验分享] bodyParser中间件的研究

[复制链接]

尚未签到

发表于 2017-2-23 10:38:51 | 显示全部楼层 |阅读模式
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' ] }
  
});

参考资料


  • body-parser
  • qs
  大多时候,我们只知道如何去使用,而不知道为什么这么用。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346106-1-1.html 上篇帖子: electron之Windows下使用 html js css 开发桌面应用程序 下篇帖子: bodyParser中间件的研究
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表