当前位置: 首页 > news >正文

bodyParser中间件的研究

原文链接:

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' ] } });

原文地址:http://www.cnblogs.com/lianer/p/5178693.html?utm_source=tuicool&utm_medium=referral

 

 

转载于:https://www.cnblogs.com/chenweizhen/p/6239110.html

相关文章:

  • asp.net mvc adminlte第一波
  • 【转】TCP/IP协议栈及OSI参考模型详解
  • 闭包2
  • 【Kubernetes】K8S 网络隔离 方案
  • 一款实时性能监测工具
  • 张小龙微信小程序演讲内容简介
  • (转)socket Aio demo
  • maven log4g 用法
  • JPA 系列教程 异常 集锦
  • react自学笔记总结不间断更新
  • 延迟构造
  • 微信小程序简易教程
  • Mysql免安装版配置【图文版和文字版】
  • 对AndroidStudio生成的项目进行压缩
  • 基于TFTP协议的远程升级设计
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 自己简单写的 事件订阅机制
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CSS 三角实现
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Linux链接文件
  • nfs客户端进程变D,延伸linux的lock
  • nginx 负载服务器优化
  • ucore操作系统实验笔记 - 重新理解中断
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 闭包--闭包作用之保存(一)
  • 浮动相关
  • 关于List、List?、ListObject的区别
  • 关于使用markdown的方法(引自CSDN教程)
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端存储 - localStorage
  • 人脸识别最新开发经验demo
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微服务入门【系列视频课程】
  • 小程序01:wepy框架整合iview webapp UI
  • 2017年360最后一道编程题
  • const的用法,特别是用在函数前面与后面的区别
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #Lua:Lua调用C++生成的DLL库
  • (8)STL算法之替换
  • (AngularJS)Angular 控制器之间通信初探
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)逆序输出字符串
  • (ros//EnvironmentVariables)ros环境变量
  • (二)windows配置JDK环境
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (强烈推荐)移动端音视频从零到上手(上)
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (小白学Java)Java简介和基本配置
  • (转)linux自定义开机启动服务和chkconfig使用方法