OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

OnceIO的模块拦截与注入:模板文件路由重定向与Model数据改写


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1483404670718
注意 转载须保留原文链接,译文链接,作者译者等信息。  

OnceIO 的模块路由和模板注入机制是与其它Web框架最主要的区别之一。软件系统时常需要针对不同的客户定制不同的功能。OnceIO的模块路由可以通过一个扩展包,对系统原有模板(Template)和填充数据(Model)进行重定向或复写。可以在不更改系统源代码的情况下,以非侵入的方式对系统进行深度定制和扩展。

 

项目组织结构

还是以一个简单的用户登录项目为例。项目中会有一个实现用户登录模块 form。还有一个功能复写模块 override。

override模块因仅用来复写form,因此没有专门的 web/css/js 文件夹。项目文件如图所示:

module_override_folder

原有登录模块的实现

form 的登录页面模板为 form.html,它又引用了页头(head.html)和页脚(foot.html)模板文件。其中还会显示填充Model的title属性。

<!DOCTYPE html>
<html>
<head>
  <link rel='stylesheet' href='/form/css/form.css'>
</head>
<body>
  <!--#include="head.html"-->
  <h1>Hello {{=it.title}}</h1>
  <form action='/form/login' method='get'>
    <p>Username: <input type='text' name='username' value='admin' /></p>
    <p>Password: <input type='text' name='password' value='123456' /></p>
    <input type='submit' value='Login' />
  </form>
  <!--#include="foot.html"-->
  <script src="/form/js/form.js"></script>
</body>
</html>

后台文件 form/svr/form.js。为了方便比较,这里注册了两个模块(app.mod):form 和 form2,其中override模块会复写form2的Template模板和Model数据。这里还通过 app.model 为全局 Model 添加了 title 属性。

/*
regist form module
*/
app.mod('form',   './form/web')
app.mod('form2',  './form/web')

//preload *.html
app.pre('form', '.html')

app.model({ title: 'Login form' })

app.get(['/form', '/form2'], function(req, res) {
  res.render('form.html')
})

app.get('/form/login', function(req, res) {
  var loginUser = req.query

  if (loginUser.password == '123456') {
    req.session.user = loginUser
    res.send('login success')
  } else {
    res.send('bad login')
  }
})

app.pre 等效于 app.preload  即告诉 onceio 预加载指定类型的模板文件。

运行后访问 localhost:8054/form 的界面是这样的:

module_override_folder

模块文件的路由重定向与复写

模块路由拦截改写是通过一个 middleware 中间件实现的,override 中声明的中间件会在form2的路由之前将所用到的Template模板文件进行重定向或者复写,并修改将向模板中填充的Model数据,form 和 form2 的路由过程如下图所示:

module_override

这里使用 res.model 来复写全局 model 的属性,并使用 res.template 来对模板文件进行重定向或修改,override/main.js 代码如下所示:

app.mod('override', './override')
app.pre('override', '.html')

app.use('/form2', function(req, res) {
  res.model({
    title : 'Title override'
  })

  res.template({
      'head.html': 'override/head.html'
    , 'foot.html': ''
  })

  req.filter.next()
})

上段代码将 header.html 模板文件重定向到了 override/head.html。并删除了 foot.html 模板的内容(空字符串),即新的 /form2 将不会再显示页脚,最终效果如图所示:

module_override_folder

模块的这种路由重写机制可以让我们以最小代价对现有系统进行深度定制,同时确保了在满足不同客户的定制要求时,系统核心代码的一致性。

 

OnceIO地址: OnceDoc/onceio

示例源码:  OnceAcademy/Lesson13.1

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NodeJS教程:基于OnceIO框架实现文件上传和验证
  2. 2016年前端技术观察
  3. 在Debian上安装Nginx并搭建一个最简单的静态网站服务器(以OnceAI为例)
  4. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  5. NodeJS中的客户端缓存、浏览器缓存、304缓存和OnceIO的缓存控制
  6. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制
  7. OnceIO(Node.JS)的静态文件路由(app.static)
  8. OnceIO(Node.JS)的网页(模板)的引用与嵌套
  9. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  10. OnceIO模块开发:模块注册、模块路由、静态文件重定向以及如何开发与设计一个功能扩展模块
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. OnceIO模块开发:模块注册、模块路由、静态文件重定向以及如何开发与设计一个功能扩展模块
  2. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  3. NodeJS教程:基于OnceIO框架实现文件上传和验证
  4. 在Debian(Raspberry Pi)树莓派上安装NodeJS
  5. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  6. OnceIO(Node.JS)的网页(模板)的引用与嵌套
  7. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制
  8. NodeJS中的客户端缓存、浏览器缓存、304缓存和OnceIO的缓存控制
  9. OnceIO(Node.JS)的路由(Routing)、路由方法和路由变量
  10. Node.JS的表单提交及OnceIO中接受GET/POST数据的三种方法

 关键字 - Node.JS
  1. node.js中fs.stat里的atime,mtime,ctime,birthtime在debian下的更新规则与区别
  2. NodeJS的DNS使用:域名解析,MX记录查询,SPF反垃圾邮件测试
  3. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  4. 是什么让Node.js比Java更快?为什么NodeJS这么快?
  5. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  6. 利用Windows注册表将你的Node.JS程序添加到右健菜单直接运行
  7. Node.js中的通用基础设计模式
  8. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  9. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  10. 6款基于Node.JS的开源内容管理和静态网站生成系统

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号