资讯专栏INFORMATION COLUMN

bodyParser中间件的研究

Richard_Gao / 2218人阅读

摘要:中间件的研究接触已有一段时间了,但最近才开始落实项目,于是使用应用生成器生成了一个应用。中间件中间件用来解析请求体,是默认使用的中间件之一。就是内建的对象之一,用来字符串化对象或解析字符串。

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.jsonbodyParser.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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78643.html

相关文章

  • vue+express+mongoose项目构建

    摘要:注仅做记录使用又不舍得删除推荐使用相关资料很多的运行环境构建基于全局安装安装过程略配置的淘宝镜象全局安装官方脚手架工具官网文档创建项目基于模板创建创建配置按需,我除了安装之外其他都选了运行与打包测试安装依赖包运行打包配 注(2018-2-12):仅做记录使用,又不舍得删除,推荐使用koa2,koa2相关资料很多的~ 1. 运行环境构建(基于macOS Sierra 10.12.4) ...

    SKYZACK 评论0 收藏0
  • express简单总结

    摘要:介绍如有不详细或者不正确的地方多多指正。可以通过官方提供的命令行进行安装,官方目前默认的界面文件用格式,建议修改为格式的文件版权问题,同时要在中安装对应的包和设置对应的界面引擎解释器。 express介绍 如有不详细或者不正确的地方多多指正。 我们可以拿js与jquery关系来类比一下: jQuery是JS在浏览器环境下的封装库,把DOM操作,ajax等封装成了兼容性好,方便使用的方法...

    ivyzhang 评论0 收藏0
  • express 框架中参数小记

    摘要:查询字符串中的参数要用比如这样的请求,应该是要用和来获取和的值,最终打印出如下关于此外,框架本身是没有解析的如果打印出来则说明没有安装解析的插件为了解析一般可以安装这个插件假设是的实例在所有路由前插入这个中间件这样就可以了。 首发地址:https://clarencep.com/2017/04...转载请注明出处 注意:req.params 只有在参数化的路径中的参数。查询字符串中的参...

    Pandaaa 评论0 收藏0
  • 从零搭建Koa2 Server

    摘要:于是翻遍与各大网站,都没找到一个好用的轻一点的脚手架,也找不到一个清晰些的搭建介绍。现在把搭建过程介绍下,看能不能方便下入门的同学。创建一个文件夹,命名。记得先装好以上版本一路回车,根据提示输入信息。但这只是初步的搭建了下。 前几天想写个小爬虫程序,准备后端就用koa2。于是翻遍github与各大网站,都没找到一个好用的、轻一点的koa2脚手架,也找不到一个清晰些的搭建介绍。githu...

    JellyBool 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<