app.map路由映射与res.template模板映射
OnceIO by wx_16020 on 1573727437590


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 这个表达式。