理解express中間件bodyparser

在學習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=張三
發佈了38 篇原創文章 · 獲贊 12 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章