express4之前,bodyparser是express下的一个对象。

express4把bodyparser分离出来。

本文中的实例基于以下的这个请求

$.ajax({
url: '/save',
type: 'post',
data: {
info: {
nane: 'henry',
age: 30
},
hobby: ['sport', 'coding']
}
});

一般来说express在接收到这个请求时,收到的请求参数是这样的

app.post('/save', function(req, res, next){
console.log(req.body);
/* {'info[name]': 'henry', 'info[age]': '30', hobby[1]: 'sport', 'hobby[2]': 'coding'} */
});

显然,这样的数据是不能直接使用的。

再看看使用bodyparser后的情况

app.use(bodyparser.urlencode());
app.post('/save', function(req, res, next){
console.log(req.body);
/* {'info': {'name': 'henry', 'age': '30'}, 'hobby': ['sport', 'coding']} */
});

bodyparser会将解析后的请求参数覆盖到req.body, 后面的中间件可以继续访问该属性。


常见的http请求的Content - type有以下几种

  • application/x-www-form-urlencoded 常见的form提交
  • multipart/form-data 文件提交
  • application/json 提交json格式的数据
  • text/xml 提交xml格式的数据
  • text/plain 提交纯文本

其中bodyparser.urlencode中间件用于解析application/x-www-form-urlencoded的请求参数

bodyparser.json中间件用于解析application/json的请求参数

另外,urlencode中间件有一个可配置的参数({extended: boolean});

这个参数为真时,中间件将使用qs模块解析请求参数,为假时使用nodejs自带的querystring来解析请求参数。

默认值是true。但是这个已经不被express官方推荐了。

来看看两者的区别

app.use(bodyparser.urlencode({extend: true}));
/* 这也是默认配置 */
app.post('/save', function(req, res, next){
console.log(req.body);
/* {'info': {'name': 'henry', 'age: '30'}, 'hobby': ['sport', 'coding']} */
});

另一种情况,使用querystring解析

app.use(bodyparser.urlencode({extended: false}));
app.post('/save', function(req, res, next){
console.log(req.body);
/* {'info[name]': 'henry', 'info[age]': '30', 'hobby[1]': 'sport', hobby[2]: 'coding'} */
});

可以看出来querystring没有很好的解析嵌套对象。所以,用qs来解析是比较合适。

但是qs自身也有涉及一些性能问题,导致解析对象的嵌套层数超过5层以后就不继续解析了。

一般来说,jq的ajax方法默认配置和form表单提交所使用的Content - type

都是application/x-www-form-urlencoded,并且提交的数据也不会有很深的嵌套,

使用qs来解析就足够了。但是如果非要上传复杂嵌套的数据,可以通过修改http请求的

Content-type 为 application/json即可。

middleware - bodyparser的更多相关文章

  1. paypal之nodejs 框架 Kraken-js 源码分析

    本文是基于 kraken-js 0.6.1 版本的 关于如何使用kraken-js 可以去看看官网的使用文档 点击这里 .kraken-js 是基于express之上的,目的在于让工程师更多的去关注代 ...

  2. 转: Nodejs 发送HTTP POST请求实例

    项目里面需要用到使用NodeJs来转发HTTP POST请求,把过程记录一下: exports.sendEmail = function (req, res) { res.send(200, req. ...

  3. nodejs的POST请求

    http://blog.csdn.net/puncha/article/details/9015317 Nodejs 发送HTTP POST请求实例 2013-06-03 17:55 71745人阅读 ...

  4. node.js 中间件

    node.js 中间件 node.js middleware Express middleware body-parser cookie-parser cookie-session cors csur ...

  5. Error: Most middleware (like bodyParser) ...

    运行NodeJS时出现如下错误: Error: Most middleware (like bodyParser) is no longer bundled with Express and must ...

  6. Connect is a middleware layer for Node.js

     Connect is a middleware layer for Node.js   http://senchalabs.github.com/connect Connect Connect is ...

  7. [Express] Level 4: Body-parser -- Post

    Parser Setup Assume the body-parser middleware is installed. Now, let's use it in our Express applic ...

  8. Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)

    原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...

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

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

随机推荐

  1. 主从LDAP

    yum -y install compat-openldap必须得安装这个   1:在主上       备份         cp /etc/openldap/slapd.conf /etc/open ...

  2. 二、innerHTML应用测试

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>inne ...

  3. ubuntu14.04安装bodhi桌面系统后,unity启动界面改变,如何还原

    按一下 ctrl + alt + f1 # 出現 tty11. sudo service lxdm stop或sudo /etc/init.d/lxdm stop如果出現錯誤訊息 不理它 繼續2. s ...

  4. .net字符串Gzip压缩和base64string转换:

    class Program { static void Main(string[] args) { //要压缩的字符串 string data = "13800138000,验证码:1234 ...

  5. JSP中的 HttpSession、pageContext对象

    pageContext 隐含对象对应javax.servlet.jsp.PageContext,都自动的被加入至pageContext中, 您可以由它来取得与JSP相关的对应之Servlet对象,像是 ...

  6. vim--macro

    例: qa some vim command q 这个宏只记录了vim命令到寄存器a中,执行这个宏可以用命令: @a 也可以加上执行次数: 10@a 执行10次 当你执行过一次@a之后,你可以用 @@ ...

  7. python实验一:画图

    题目:画图,学用rectangle画方形. rectangle(int left, int top, int right, int bottom) 参数说明:(left ,top )为矩形的左上坐标, ...

  8. WCF账户密码认证

    记录一下我实现WCF用户认证与权限控制的实现方法, 也让其他网友少走一些弯路. 内容写得非常小白(因为我也是小白嘛), 比较详细, 方便WCF知识基础薄的朋友 主要分为下面几个步骤 作为例子, 创建最 ...

  9. SQL三大范式三个例子搞定

    第一范式(1NF) (必须有主键,列不可分) 数据库表中的任何字段都是单一属性的,不可再分 create table aa(id int,NameAge varchar(100)) insert aa ...

  10. export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

    如题,临时修改程序运行时动态库的搜索路径,平时经常会用到,记录之!