PocketLibs(2)—— 請求相關 path-to-regexp

code in here
使用path-to-regexp,咱們能夠在路徑字符串中使用正則。如/:foo*/:bar?/icon-:foo(\\d+).png等。
像express、vue好多框架都引用它作路徑匹配,看一看,一勞永逸。javascript

直接調用構造函數使用,一個可能含某種匹配模式的路徑字符串做爲它的必選參數,它返回一個正則對象
咱們的請求路徑與該正則匹配,匹配成功就是接上頭了。vue

const pathToRegexp = require('path-to-regexp')
var regexp_1 = pathToRegexp('/foo/:bar')// /^\/foo\/([^\/]+?)(?:\/)?$/i
regexp_1.exec('/foo/barrrr')//匹配成功 =>RegExpExecArray [ '/foo/barrrr', 'barrrr', index: 0, input: '/foo/barrrr' ]
regexp_1.exec('/bazzzz')//匹配失敗 => null

/foo/:bar中的/爲分隔符,把多個匹配模式分隔開,這裏就分紅foo:bar。像foo這種不帶:前綴的,咱們請求的路徑須要和它徹底匹配,而:bar這種,叫命名參數,就像個函數形參,能夠傳遞任何請求路徑字串給它。java

在命名參數上,咱們能夠使用參數修飾符做爲其後綴,有?+*git

var regexp_2 = pathToRegexp('/foo/:bar*')
regexp_2.exec('/foo/a/b/c')// => [ '/foo/a/b/c', 'a/b/c', index: 0, input: '/foo/a/b/c' ]
regexp_2.exec('/foo')// => [ '/foo', undefined, index: 0, input: '/foo' ]

*表示我這個命名參數:bar能夠接收隨意個匹配模式,就好像參數數組長度[0,+∞)express

var regexp_3 = pathToRegexp('/foo/:bar+')
regexp_3.exec('/foo/a/b/c')// => [ '/foo/a/b/c', 'a/b/c', index: 0, input: '/foo/a/b/c' ]
regexp_3.exec('/foo')//匹配失敗 =>  null

+ 表示命名參數能夠接收至少一個匹配模式,一個都沒就匹配失敗,[1,+∞)數組

var regexp_4 = pathToRegexp('/foo/:bar?')
regexp_4.exec('/foo/a')// => [ '/foo/a', 'a', index: 0, input: '/foo/a' ]
regexp_4.exec('/foo/a/b/c')// => null
regexp_4.exec('/foo')// => [ '/foo', undefined, index: 0, input: '/foo' ]

? 表示命名參數能夠接收0個或1個匹配模式,多個失敗,[0,1]框架

咱們還能夠爲命名參數加上自定義的正則匹配模式函數

var regexp_5 = pathToRegexp('/icon-:foo(\\d+).png')
regexp_5.exec('/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_5.exec('/icon-abc.png')// null

以上設置表示:foo只能是數字。ui

更牛X的是,某些時候不須要命名參數這個佔位符,經過正則就能就能匹配。code

var regexp_5 = pathToRegexp('/icon-(\\d+).png')
regexp_5.exec('/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_5.exec('/icon-abc.png')// null

以上就是這個lib包含的全部匹配形式了。

雞肋部分

path-to-regexp還包含了沒什麼用的參數和方法。

構造函數上的可選參數keys

var regexp_6 = pathToRegexp('/:foo/icon-(\\d+).png',keys)
regexp_6.exec('/home/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_6.exec('/about/icon-abc.png')// null
console.log(keys) 
/**
keys output =>
[ { name: 'foo',
    prefix: '/',
    delimiter: '/',
    optional: false,
    repeat: false,
    partial: false,
    pattern: '[^\\/]+?' },
  { name: 0,
    prefix: '',
    delimiter: '/',
    optional: false,
    repeat: false,
    partial: false,
    pattern: '\\d+' } ]
*/

keys爲一個數組,包含了全部參數的具體信息,看屬性名就知道這些信息具體是幹嗎的了。
注意: 未命名參數的keys.name0

方法pathToRegexp.parse(path),接收一個路徑字符串參數

var tokens = pathToRegexp.parse('/foo/:baz/icon-(\\d+).png')
console.log(tokens)
/**
tokens output =>
[ '/foo',
  { name: 'baz',
    prefix: '/',
    delimiter: '/',
    optional: false,
    repeat: false,
    partial: false,
    pattern: '[^\\/]+?' },
  '/icon-',
  { name: 0,
    prefix: '',
    delimiter: '/',
    optional: false,
    repeat: false,
    partial: false,
    pattern: '\\d+' },
  '.png' ]
*/

該方法返回一個tokens數組,該數組與keys相似,不過它還包含路徑中那些非參數部分,如tokens[0]/foo

咱們能夠不傳具體的路徑字符串,而使用tokens代替。

var regexp_7 = pathToRegexp.tokensToRegExp(tokens)
regexp_7.exec('/foo/bazzz/icon-123.png')//[ '/foo/bazzz/icon-123.png','bazzz','123',... ]
var toPathWithTokens = pathToRegexp.tokensToFunction(tokens)
toPathWithTokens({baz:'bazzz',0:'123'}) // => /foo/bazzz/icon-123.png

有兩個方法:
pathToRegexp.tokensToRegExp(tokens) 返回一個正則對象,效果與調用構造函數同樣
pathToRegexp.tokensToFunction(tokens) 返回一個函數,該函數與下面的compile(path)返回的函數功能同樣

方法 pathToRegexp.compile(path),一樣接收一個路徑字符串。

var toPath = pathToRegexp.compile('/foo/:baz/icon-(\\d+).png')
toPath({baz:'bazzz',0:'123'})//=> /foo/bazzz/icon-123.png

該方法返回一個函數,該函數接收一個對象,以對象的形式傳值給路徑參數,返回請求路徑。

相關文章
相關標籤/搜索