bodyParser中间件的研讨

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

参考资料

大多时刻,我们只知道怎样去运用,而不知道为何这么用。

    原文作者:半年的半年
    原文地址: https://segmentfault.com/a/1190000004407008
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞