您的位置:首页 > 其它

理解express中间件bodyparser

2017-05-12 10:36 591 查看
在学习express+mysql过程中,用到了post请求。在请求体中找不到data过来的数据,翻阅资料,需要使用bodyparser中间件。果然使用过后请求体中出现了数据。但是对于以前没有接触过后端的我,并不懂其中的道理。

首先,bodyparser的作用是,解析http请求体。解析成功后覆盖原来的req.body,如果解析失败则为 {} 。

express在3.0版本中自带有很多中间件,但是在express 4.0以后,就将除static(静态文件处理)以外的其他中间件分离出来了;在4.0以后需要使用中间件时,就需要单独安装好相应的中间件以后调用。

官方API:https://www.npmjs.com/package/body-parser

bodyParser.json是用来解析json数据格式的。bodyParser.urlencoded则是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded。

除了以上两种方法还有bodyparser.text,bodyparser.raw。

常见的四种Content-Type类型:

application/x-www-form-urlencoded 常见的form提交

multipart/form-data 文件提交

application/json 提交json格式的数据

text/xml 提交xml格式的数据

jquery默认的 content-Type 配置的是 application/x-www-form-urlencoded

bodyParser.urlencoded里面有一个extended扩展属性。

extended选项允许配置使用querystring(false)或qs(true)来解析数据,默认值是true,但使用默认值已被弃用。

querystring

querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析。

这4个方法分别是querystring.parse和querystring.stringify,querystring.escape和querystring.unescape。

1 querystring.parse(str,separator,eq,options)

parse这个方法是将一个字符串反序列化为一个对象。

参数:str指需要反序列化的字符串;

   separator(可省)指用于分割str这个字符串的字符或字符串,默认值为”&”;

   eq(可省)指用于划分键和值的字符或字符串,默认值为”=”;

   options(可省)该参数是一个对象,里面可设置maxKeys和decodeURIComponent这两个属性:

   maxKeys:传入一个number类型,指定解析键值对的最大值,默认值为1000,如果设置为0时,则取消解析的数量限制;

   decodeURIComponent:传入一个function,用于对含有%的字符串进行解码,默认值为querystring.unescape。在官方API的例子中,使用gbkDecodeURIComponent这个方法会报错,显示gbkDecodeURIComponent is no defined,这是因为在使用这个gbkDecodeURIComponent这个方法之前需要先进行定义。在API中也写了Assuming gbkDecodeURIComponent function already exists…这句话的意思是”假设这个gbkDecodeURIComponent方法已经存在”。

在使用前首先需要先引入模块;

const querystring=require('querystring');


const str='name=20&age=20&age=30';
const str2=querystring.parse(str); //{ name: '20', age: [ '20', '30' ] }

const str3='name=50#age=30#age=40';
const str4=querystring.parse(str3,'#',null,{maxKeys:2});//{ name: '50', age: '30' }


2 querystring.stringify(obj,separator,eq,options)

stringify这个方法是将一个对象序列化成一个字符串,与querystring.parse相对。

参数:obj指需要序列化的对象

   separator(可省)用于连接键值对的字符或字符串,默认值为”&”;

   eq(可省)用于连接键和值的字符或字符串,默认值为”=”;

   options(可省)传入一个对象,该对象可设置encodeURIComponent这个属性:

      encodeURIComponent:值的类型为function,可以将一个不安全的url字符串转换成百分比的形式,默认值为querystring.escape()。

const str5={name:'zz',age:20};
const str6=querystring.stringify(str5);//name=zz&age=20

const str7={name:'zz',age:[20,30]}
const str8=querystring.stringify(str7,'#',':');//name:zz#age:20#age:30


3 querystring.escape(str)

escape可使传入的字符串进行编码

const str9=querystring.escape(name='张三'); //name%3D%E5%BC%A0%E4%B8%89


4 querystring.unescape(str)

unescape将传入的%编码的字符串进行解码

const str10=querystring.unescape('name%3D%E5%BC%A0%E4%B8%89');//name=张三
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  中间件