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)