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
 
时间: 2024-07-29 10:17:18

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

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

昨天我们使用的网关转发数据时出了点问题! 情景是这样的,另一方以Post的形式向我的node.js服务推送JSON数据.但是使用bodyParser中间件后,在req.body中拿不到任何信息. 代码如下: app.use(bodyParser.json()); app.post('/api/*',function(req,res){ _option.onMessage({url:req.url,query:req.query,body:req.body},function(error,data

MySQL分布式数据库服务中间件--Cobar研究一

官网 (http://code.alibabatech.com/wiki/display/cobar/Home 这个貌似已经不用了,总是打不开) 数据已经同步到  https://github.com/alibaba/cobar Cobar是阿里巴巴的开源产品,他的前身是Amoeba,2012年6月正式开源,由阿里巴巴的贺贤懋继续维护. 一. 介绍 Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明. 产品

MySQL分布式数据库服务中间件--Cobar研究三

在实际应用中,经常需要部署一个Cobar集群,再结合软负载LVS或者硬件负载设备F5对外提供服务:我们称集群中的一台Cobar为一个Cobar节点,这篇就来学习下cobar集群部署以及一些常用管理命令. 一.配置cobar cluster 只需要在server.xml中加入cluster配置即可 more server.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cobar:server

MySQL分布式数据库服务中间件--Cobar研究二

这篇来学习下Cobar的具体使用配置 场景: 系统对外提供的数据库名是UserCenter,并且其中有一张表u_user 该表的一部分数据被映射到物理数据库alicobar_test_master的u_user上,另外一部分数据被映射到物理数据库alicobar_test_shard的u_user上. 一.环境准备 OS:CentOS6.4 64位 DB:MySQL5.6.22 JDK:1.7 Cobar:1.2.7 MySQL-master      192.168.89.4       端口

node的express中间件之bodyParser

bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理. 下面是一个文件上传的例子. 建立一个1.html页面 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>向服务器上传文件</title> 6 <script

node中express的中间件之methodOverride

methodOverride中间件必须结合bodyParser中间件一起使用,为bodyParser中间件提供伪HTTP方法支持. index.html代码: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>向服务器上传文件</title> 6 <script type=&quo

express文件上传中间件Multer详解

Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON.二进制.字符串)数据,可以使用body-parser中间件.而文件上传(multipart/form-data请求),可以基于请求流处理,也可以使用formidable模块或Multer中间件. 1. multer中间件 Multer是Express官方推出的,用于Node.jsmultipart/form-data请求数据处理的中间件. 它基于busboy构建,可以高效的处理文件上传,但并不处理multipart/fo

大型网站系统与Java中间件实践

大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4月出版 定价:65.00元 340页 16开 编辑推荐 到底是本什么书,拥有这样一份作序推荐人列表:阿里集团章文嵩博士|新浪TimYang|去哪网吴永强|丁香园冯大辉|蘑菇街岳旭强|途牛汤峥嵘|豆瓣洪强宁|淘宝陈皓/林昊-- 这本书出自淘宝技术部总监之手,他也是淘宝近10年来历次技术飞跃的参与者.贡

express中间件原理 &amp;&amp; 实现

一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = require('express'); var app = express(); app.listen(3000, function () { console.log('listening 3000') }); app.use(middleware1); app.use(middleware2); ap