原文链接:

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
 

bodyParser中间件的研究的更多相关文章

  1. express第三方中间件研究之bodyParser中间件

    转载至:http://www.cnblogs.com/lianer/p/5178693.html 接触nodejs已有一段时间了,但最近才开始落实项目,于是使用express应用生成器生成了一个应用. ...

  2. 使用node.js的bodyParser中间件读取post数据解析

    昨天我们使用的网关转发数据时出了点问题! 情景是这样的,另一方以Post的形式向我的node.js服务推送JSON数据.但是使用bodyParser中间件后,在req.body中拿不到任何信息. 代码 ...

  3. 新版本的body-parser中间件和morgan中间件引用问题:body-parser deprecated bodyParser和morgan deprecated morgan(options)

    引用新版本的body-parser中间件和morgan中间件时,报如下问题: Fri, 09 Jan 2015 06:32:04 GMT morgan deprecated morgan(option ...

  4. Express bodyParser中间件使用方式

    bodyParser中间件用来解析http请求体,是express默认使用的中间件之一. 1.这个模块提供以下解析器 (1) JSON body parser (2) Raw body parser ...

  5. node express+mysql搭建简易API服务—body-parser中间件

    最近用express搭建了一个简单的RESTful风格的API服务,数据库使用mysql,主要用于获取数据库数据,模糊搜索等. 需要用到的模块: express:这个都很熟悉了: body-parse ...

  6. nodejs数据接收body-parser中间件

    给大家翻译一下npm上body-parser的资料 nodejs 的body数据解析中间件 插件作用:对于req.body属性,在操作数据前分析进来的请求体的插件 首先学习解析一个http处理 这篇文 ...

  7. 图片上传之FileAPI与NodeJs

    HTML5之fileAPI HTML5之fileAPI使得我们处理图片上传更加简单. 实例 html代码 <div class="form-group"> <la ...

  8. webpack 配置react脚手架(六):api

    1 访问网址 https://cnodejs.org/api 可以调取api 2.//该body-parser 可以将请求的body数据,转变成 json 格式数据://express-session ...

  9. node的express中间件之bodyParser

    bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理. 下面是一个文件上传的例子. 建立一个1.html页面 <!DOCTYP ...

随机推荐

  1. 常见web攻击以及防御

    xss攻击: 跨站脚本攻击,攻击者在网页中嵌入恶意代码,当用户打开网页,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie,用户名密码,下载执行病毒木马程序,甚至是获取客户端admin权限 ...

  2. echarts-在现实标题中显示百分比

    如图:需要在标题显示所占百分比 使用方式:途中标记部分 series : [{ name: '类型', type: 'pie', radius : '55%', center: ['50%', '60 ...

  3. 并发包的线程池第二篇--Executors的构造

    上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...

  4. Servlet学习笔记

    在这里记录最重要的要点 1,tomcat-->conf-->server.xml里面的东西是什么?(tomcat怎么知道“谁”去处理客户端来的请求?) 最主要的是一个依赖的控制,换句话说什 ...

  5. 一个解析json串并组装echarts的option的函数解析

    缘起: 在组装echart页面的时候,遇到这样一个问题,它是一个需要在循环内层的时候,同时循环外层,在内层循环中就要将外层获取的值存入,导致了一种纠缠状态,费了老劲儿,终于得到如下解决.记录之,绿色为 ...

  6. x509数字证书导入-然后删除自身

    这种程序的使用场景,需要给客户一个证书,但不能把证书直接给他让他安装,程序中需要用到给客户的私钥,但又不允许客户将这个证书再去授权给其它人. 重点并不是代码,是如何对用户隐藏需要添加的资源 ,以文本为 ...

  7. Reset Identity Column Value in SQL Server (Identity Reset)

    前言:今天在群里看到有人在问SQL Server自增值重置问题(sqlserver identiy column value reset ) 闲话少说,直接上代码: 正文: --create tabl ...

  8. RF 基本方法

    1. Select From List id=sourceConn oracle_source 从下拉框选取值. 2. Select Radio button  name value 选择单选框.也可 ...

  9. 【原创】贴个dirtycow(脏牛漏洞)不死机的exploit

    dirtycow官网上几个获得rootshell的exp大都会导致机器死机,在原作者的基础上改进了一下,做个记录: /* * (un)comment correct payload first (x8 ...

  10. UUID库

    If you cannot afford to use Boost, then there is a very minimal library that I implemented which sim ...