app.map路由映射与res.template模板映射


发布人 青竹-Kris  发布时间 1573727437590
关键字 OnceIO 

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

 





回复 (0)
  • #
 近期最热
  1. 使用node.js和oAuth2协议集成Github/LinkedIn第三方登录以OnceOA模块源码为例
  2. 在Linux上安装OnceDoc/OnceOA旺司免费企业管理驱动引擎知识管理套件,Debian/Ubuntu/CentOS/Redhat
  3. Workflow流程管理模块使用指南
  4. OnceAir系统盘备份与还原:使用大容量TF卡扩充系统盘,putty远程连接自动填满存储空间
  5. OnceOA旺司云流程协作模块使用说明:企业招聘面试流程图设计,团队协作审批,微信通知
  6. 外网访问内网SVN/Git服务及共享文件夹:OnceAir内网穿透TCP使用教程
  7. SVN安装使用教程:用OnceAir搭建低功耗文件版本控制服务器
  8. OnceAir旺天云盘Linux命令行terminal模块安装与使用
  9. 使用TortoiseGit和SmartGit图形客户端从OnceAir Git仓库Clone文件
  10. Git模块使用教程:在OnceAir上搭建低功耗Git服务器

 相关文章
  1. 模块安装教程:5秒为OnceDoc扩展新功能
  2. 在OnceIO(Node.JS)中用Redis储存Session
  3. OnceIO(Node.js)模块拦截与注入:模板文件路由重定向与Model数据改写
  4. OnceIO(Node.JS)模块开发:模块注册、模块路由、静态文件重定向以及如何开发与设计一个功能扩展模块
  5. NodeJS教程:基于OnceIO框架实现文件上传和验证
  6. OnceIO(Node.JS)中Session简介与Cookie的关系和使用方法
  7. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  8. OnceIO(Node.JS)的网页(模板)的引用与深层嵌套
  9. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制
  10. NodeJS中的客户端缓存、浏览器缓存、304缓存和OnceIO的缓存控制

 关键字
OnceIO

 关注
关注
OnceOA

OnceOA