OnceIO提供一种机制,在不改变原有系统的情况下,可以复用原系统的filter(middleware)和handler,而不必修改原系统的编码。
示例:
//router mapping
app.map({
'/blog/user/:poster': '/userinfo/:poster'
})
app.map('/ask/key/:key', '/bbs/:key')
这样访问路径就实现了路由映射。用户访问 /bbs/c# 时,会自动使用 /ask/key/c# 的逻辑,从而改变网址的访问形式。
打印所有的路由
映射前可以打印所有路由,以便知道如何映射。
OnceDoc.on('ready', function(e) {
console.trace(app.handlers)
})
显示所有的信息:
Trace: [ { expression: '/default',
handler: [Function],
file: 'svr\\oncedoc.js',
method: 'GET' },
{ expression: '/',
handler: [Function],
file: 'svr\\oncedoc.js',
method: 'GET' },
...
{ expression:
[ '/blog/view/:id',
'/blog/view-html/:id',
'/blog/view-nonav/:id',
'/ask/view/:id' ],
handler: [Function],
file: 'mod\\blog\\svr\\blog.article.js',
method: 'GET' },
...
... 15 more items ]
at EventEmitter.<anonymous> (D:\github\oncedoc\oncedoc\mod\ourjs\svr\ourjs.main.js:50:11)
at EventEmitter.emit (events.js:194:15)
at D:\github\oncedoc\oncedoc\svr\oncedoc.js:440:19
at D:\github\oncedoc\oncedoc\svr\module.js:403:13
at FSReqWrap.args [as oncomplete] (fs.js:140:20)
映射原理
映射是通过 handler 的表达式来实现的,表达式支持数据,只要匹配其中一个就可以了。
比如下面对 /blog/user/:poster 的响应:
可添加 console.trace 打印 mapper 对象:
app.url('/blog/user/:poster', function(req, res) {
var mapper = this
console.trace(mapper)
..
})
打印的信息如下:
Handler matched 71 [ '/blog/user/:poster', '/userinfo/:poster' ] /userinfo/ourjs
Trace: { expression: [ '/blog/user/:poster', '/userinfo/:poster' ],
handler: [Function],
file: 'mod\\blog\\svr\\blog.article.js',
loose: true }
at Mapper.handler (D:\github\oncedoc\oncedoc\mod\blog\svr\blog.article.js:118:11)
at handle (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:296:16)
at parseBody (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:352:9)
at parseFile (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:393:9)
at parseSession (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:312:9)
at parseCookies (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:422:7)
at Parser (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:425:5)
at Object.handle (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:996:15)
at FilterChain.cb (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:2083:16)
at FilterChain.next (D:\github\oncedoc\oncedoc\svr\onceio\onceio.js:851:43)
可以看到, expression 变成了: [ '/blog/user/:poster', '/userinfo/:poster' ], 相当于变成了:
app.url( [ '/blog/user/:poster', '/userinfo/:poster' ], function(req, res) {
var mapper = this
console.trace(mapper)
..
})
Mapper参数
isLoose: true
代表是否为松散匹配,true 代表,只需要匹配开始的一部分即可,比如,对于 app.get(;'/user/:name', cb) 这样的表达式,以下网页请求的匹配结果:
/user/kris #匹配
/user/kris/name #匹配, 当 isLoose: false 时不匹配
/user/kris2 #不匹配
isLoose 参数可通过来指定
app.METHOD(expresion, callback, { loose: true })
req.expression
表明当前匹配的是哪一个表达式,比如:
app.url('/blog/user/:poster', function(req, res) {
console.log(req.expression)
...
})
当访问 /userinfo/ourjs 时,会打印:
Handler matched 71 [ '/blog/user/:poster', '/userinfo/:poster' ] /userinfo/ourjs
/userinfo/:poster
即匹配的是 /userinfo/:poster 这个表达式。