Node.js querystring

Query String

穩(wěn)定性:2 - Stable

querystring模塊是node.js解析和格式化URL查詢字符串的工具。在node.js中捷雕,querystring代表查詢字符串袁波,說白了就是HTTP GET方法請求服務(wù)器的查詢參數(shù),如果你還是不清楚這個(gè)概念徒扶,看了下圖就明白了:

黃色的框內(nèi)就是查詢字符串

為什么要用Query String工具

首先要了解URI為什么要編碼,可以參考這篇文章URI編碼
下文用百分號編碼代表URI編碼

  • 使用安全的字符表示不安全的字符,如中文,某些特殊的字符等悲敷。這樣的話不管是瀏覽器環(huán)境,或者服務(wù)器環(huán)境俭令,傳輸?shù)臄?shù)據(jù)都是安全的后德,可以正確地使用,不會出現(xiàn)數(shù)據(jù)的丟失或顯示錯(cuò)誤的情況
  • 消除一些有歧義的字符抄腔,舉個(gè)例子瓢湃,你想通過一個(gè)參數(shù)data傳輸'&a=1&b=1&c=1'這幾個(gè)字符,如果這樣寫
data=&a=1&b=1&c=1 // 服務(wù)器解析的時(shí)候?qū)嶋H是四個(gè)參數(shù):data赫蛇,a绵患,b,c

但如果通過querystring處理悟耘,它就是下面這種情況

data=%26a%3D1%26b%3D1%26c%3D1  // 安全傳輸data

所以在處理查詢參數(shù)的時(shí)候使用querystring是很有必要的落蝙,使用之前首先要引用它:

const querystring = require("querystring"); 
import querystring from "querystring";    //es6 也可以這樣寫,這兩種方式都可以

querystring.escape(str)

  • str <String>
    這個(gè)方法跟JavaScript原生的方法encodeURIComponent得到的結(jié)果是一樣的暂幼,根據(jù)規(guī)則將不安全的字符轉(zhuǎn)化為百分號編碼筏勒。
// 兩個(gè)結(jié)果是一樣的
encodeURIComponent('&a=1&b=1&c=1')
// returns '%26a%3D1%26b%3D1%26c%3D1'
querystring.escape('&a=1&b=1&c=1')
// returns '%26a%3D1%26b%3D1%26c%3D1'

但請注意,這個(gè)方法是querystring.stringify所使用的旺嬉,不要直接調(diào)用哦9苄小!

querystring.stringify(obj[, sep[, eq[, options]]])

  • obj <Object> 把該對象序列化成URL的查詢字符串
  • sep <String> 劃分obj每個(gè)鍵值對的符號邪媳,默認(rèn)是'&'
  • eq <String> 連接obj鍵和值的符號病瞳,默認(rèn)是'='
  • options <Object>
    encodeURIComponent <function> 這個(gè)函數(shù)將不安全的字符轉(zhuǎn)化為百分號編碼揽咕,默認(rèn)是querystring.escape()

一些例子:

querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' })    
// corge的值替換成null,undefined套菜,NaN結(jié)果是一樣的
// returns 'foo=bar&baz=qux&baz=quux&corge='

querystring.stringify({foo: 'bar', baz: 'qux'}, ';', ':')
// returns 'foo:bar;baz:qux'

querystring.stringify({ data: '&a=1&b=1&c=1'})
// returns 'data=%26a%3D1%26b%3D1%26c%3D1'

以上的字符編碼默認(rèn)是UTF-8亲善,如果想用其他的編碼方式,可以這樣寫

// 假設(shè)gbkEncodeURIComponent方法已經(jīng)存在

querystring.stringify({ w: '中文', foo: 'bar' }, null, null,
  { encodeURIComponent: gbkEncodeURIComponent })

querystring.unescape(str)

  • str <String>
    該方法是將百分號編碼解碼逗柴,與querystring.escape()的作用正好是相反的蛹头。它默認(rèn)使用的是JavaScript內(nèi)置的方法decodeURIComponent(),如果失敗戏溺,將使用更安全的等價(jià)值(格式正確的URLs)渣蜗。同樣,該函數(shù)是被querystring.parse所使用的旷祸,不要直接調(diào)用哦

querystring.parse(str[, sep[, eq[, options]]]

  • str <String> 需要解析的URL查詢字符串
  • sep <String> 劃分鍵值對的符號耕拷,默認(rèn)是'&'
  • eq <String> 劃分鍵和值的符號,默認(rèn)是'='
  • options <Object>
    decodeURIComponent <Function> 將百分號編碼解碼托享, 默認(rèn)是querystring.unescape()
    maxKeys <number> 設(shè)置最大解析鍵值對的個(gè)數(shù)骚烧,默認(rèn)是1000,如果是0則沒有限制
querystring.parse('data=%26a%3D1%26b%3D1%26c%3D1&foo=bar&abc=xyz&abc=123')
// returns { data: '&a=1&b=1&c=1', foo: 'bar', abc: [ 'xyz', '123' ] }

querystring.parse('data=%26a%3D1%26b%3D1%26c%3D1&foo=bar&abc=xyz&abc=123', null, null, {maxKeys:2})
// returns { data: '&a=1&b=1&c=1', foo: 'bar' }

通過querystring.parse()返回的對象闰围,不是JavaScript原型Object的擴(kuò)展赃绊,所以原型Object一些相關(guān)的方法無法使用,如obj.toString()羡榴,obj.hasOwnProperty()

querystring.parse('foo=bar&abc=xyz').toString()    // 報(bào)錯(cuò)
{a: 1, b: 2}.toString()    // 不會報(bào)錯(cuò)

同樣碧查,這個(gè)方法的字符編碼也是UTF-8,如果想用其他的編碼方式校仑,可以參照下面的代碼:

// 假設(shè) gbkDecodeURIComponent 方法已存在
querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null,
  { decodeURIComponent: gbkDecodeURIComponent })

本文檔是根據(jù)nodeJS目前穩(wěn)定版本的文檔Node.js v6.10.0 Documentation進(jìn)行總結(jié)的忠售,如您在閱讀的過程中發(fā)現(xiàn)問題,請聯(lián)系作者迄沫,最后感謝您的支持档痪!

簡書作者 小菜荔枝 轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邢滑,隨后出現(xiàn)的幾起案子腐螟,更是在濱河造成了極大的恐慌,老刑警劉巖困后,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乐纸,死亡現(xiàn)場離奇詭異,居然都是意外死亡摇予,警方通過查閱死者的電腦和手機(jī)汽绢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侧戴,“玉大人宁昭,你說我怎么就攤上這事跌宛。” “怎么了积仗?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵疆拘,是天一觀的道長。 經(jīng)常有香客問我寂曹,道長哎迄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任隆圆,我火速辦了婚禮漱挚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渺氧。我一直安慰自己旨涝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布侣背。 她就那樣靜靜地躺著白华,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秃踩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天业筏,我揣著相機(jī)與錄音憔杨,去河邊找鬼。 笑死蒜胖,一個(gè)胖子當(dāng)著我的面吹牛消别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播台谢,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寻狂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朋沮?” 一聲冷哼從身側(cè)響起蛇券,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎樊拓,沒想到半個(gè)月后纠亚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筋夏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年蒂胞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片条篷。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骗随,死狀恐怖蛤织,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸿染,我是刑警寧澤指蚜,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站牡昆,受9級特大地震影響姚炕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丢烘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一柱宦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧播瞳,春花似錦掸刊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牌芋,卻和暖如春蚓炬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺屁。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工肯夏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犀暑。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓驯击,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耐亏。 傳聞我的和親對象是個(gè)殘疾皇子徊都,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容