express-19 路由2
组织路由
在主应用程序文件中定义所有路由太笨重了。那样不仅会导致那个文件一直增长,还不利于功能的分离,因为那个文件里已经有很多东西了。
四条组织路由的指导原则
- 给路由处理器用命名函数: 到目前为止,我们都是在行内写路由处理器的,实际上就是马上在那里定义处理路由的函数。这对于小程序或原型来说没问题,但随着网站的增长,这种方式很快就会变得过于笨重。
- 路由不应该神秘: 一种极端的做法是简单地把网站的所有路由都放到一个文件中,好知道它们在哪。对于大型网站来说,可能不想这样,那就根据功能区域把路由分开;然而,即便如此,也应该清楚该到哪里找给定的路由。
- 路由组织应该是可扩展的:
- 不要忽视自动化的基于视图的路由处理器: 如果网站由很多静态和固定URL的页面组成,所有路由最终看起来将像是:
app.get('/static/thing', function(req, res){ res.render('static/thing'); }。要减少不必要的重复代码,可以考虑使用自动化的基于视图的路由处理器。
在模块中声明路由
- 组织路由的第一步是把它们都放到它们自己的模块中。
- 一种方式是将你的模块做成一个函数,让它返回包含“方法”和“处理器”属性的对象数组。然后可以这样在应用程序文件中定义路由:
var routes = require('./routes.js')();
routes.forEach(function(route){
app[route.method](route.handler);
})
- 这种方式有它的优势,并且可能非常适合动态地存储路由,比如在数据库或JSON文件中。然而,如果不需要那样的功能,建议将app实例传给模块,然后让它添加路由。
//routes.js
module.exports = function(app){
app.get('/', function(req,res){
app.render('home');
}))
//...
};
//连入路由,在meadowlark.js中直接引入路由:
require('./routes.js')(app);
按逻辑对处理器分组
要满足第一条指导原则(给路由处理器用命名函数),需要找地方放那些处理器。更极端的做法是给每个处理器建一个JavaScript文件。很难想象这种方式在哪种场景下会带来好处。
以某种方式将相关功能分组更好。那样不仅更容易利用共享的功能,并且更容易修改相关的方法。
先把功能分组到各自的文件中:handlers/main.js中放首页处理器、/about处理器,以及所有不属于任何其他逻辑分组的处理器,handlers/vacations.js中放跟度假相关的处理器,以此类推。
//handlers/main.js:
var fortune = require('../lib/fortune.js');
exports.home = function(req, res){
res.render('home');
};
exports.about = function(req, res){
res.render('about', {
fortune: fortune.getFortune(),
pageTestScript: '/qa/tests-about.js'
} );
};
//...
//接下来修改routes.js以使用它:
var main = require('./handlers/main.js');
module.exports = function(app){
app.get('/', main.home);
app.get('/about', main.about);
//...
};
- 如果routes.js变得笨重了,我们可以再用相同的技术,把app传给另一个模块,再注册更多路由
自动化渲染视图
- 如果你的网站有很多内容,但功能不多,你可能发现给每个视图添加一个路由是不必要的麻烦。
var autoViews = {};
var fs = require('fs');
app.use(function(req,res,next){
var path = req.path.toLowerCase();
// 检查缓存;如果它在那里,渲染这个视图
if(autoViews[path]) return res.render(autoViews[path]);
// 如果它不在缓存里,那就看看有没有.handlebars文件能匹配
if(fs.existsSync(__dirname + '/views' + path + '.handlebars')){
autoViews[path] = path.replace(/^\//, '');
return res.render(autoViews[path]);
}
// 没发现视图;转到404处理器
next();
});
- 注意,常规路由会避开这一机制(因为我们把自动视图处理器放在了其他所有路由后面),所以如果你有个路由为/foo渲染了不同的视图,那它会取得优先权。
其他的路由组织方式
- 最流行的两种路由组织方式是命名空间路由和随机应变路由。
- 当很多路由都以相同的前缀开始时,命名空间路由很不错(比如/vacations)。有个Node模块叫
express-namespace,它让这种方式变得很容易。 - 随机应变路由基于一个对象中的方法自动添加路由。如果网站的逻辑是天然面向对象的,这项技术就很好用。
express-resource包是如何实现这种路由组织风格的范例。
- 当很多路由都以相同的前缀开始时,命名空间路由很不错(比如/vacations)。有个Node模块叫
路由在项目中很重要,如果我在本章中介绍的基于模块的路由技术看起来不适合你,我建议你看看express-namespace或express-resource的文档。
express-19 路由2的更多相关文章
- Express的路由详解
Express的路由详解 http://www.jb51.net/article/76203.htm
- express 的路由学习
使用步骤 - :获取路由中间件对象 `let router = express.Router();` - :配置路由规则 `router.请求方式(URL,fn事)` - fn中参数有req,res, ...
- 类似express的路由封装方式
1.原理 主要过程涉及三个元素的定义,如下: //用于承载一系列方法的对象 var funObj = {}; //用于根据条件执行funObj中的方法 var app = function(){}; ...
- express框架路由配置及congtroller自动加载
express框架在node官方推荐的一个框架,关于如何入门的文章,已经很多了,我就不在累赘了,本文的核心是如何修改文件使得更接近一个MVC的框架 express原生是通过require的方式实现了模 ...
- 【Express】路由
var express = require('express'); var app = express(); app.set('port', process.env.PORT || 3000); ap ...
- node.js零基础详细教程(5):express 、 路由
第五章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- Express全系列教程之(二):Express的路由以及动态路由
一.Express路由简介 路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式.它包含一个请求方时(methods).路径(path)和路由匹配时的函数(callback); app.m ...
- Express 体验 路由、模板引擎、中间件
http://expressjs.com/en/4x/api.html#req.method http://expressjs.com/en/guide/routing.html [Route pat ...
- NodeJS之express的路由浅析
路由路径和请求方法一起定义了请求的端点,它可以是字符串.字符串模式或者正则表达式.后端在获取路由后,可通过一系列类似中间件的函数去执行事务. 可使用字符串的路由路径: // 匹配根路径的请求 app. ...
随机推荐
- SQL Server case表达式的用法
★CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值.因为CASE是一个标量表达式,所以它可以应用在SELECT.WHERE.HAVING以及ORDER BY子句中. CASE表达式有两种格式 ...
- 【编程题目】请修改 append 函数,利用这个函数实现两个非降序链表的并集
42.请修改 append 函数,利用这个函数实现(链表):两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能输出结 ...
- NEFU 169 步步惊心
Description 马尔泰·若曦是康熙年间镇西大将军马尔泰的小女儿,自幼失母,却深得父亲姐姐宠爱,性格活泼任性.张晓,本是21世纪一都市白领,聪慧谨慎,玲珑剔透.因车祸而灵魂穿越到若曦身上,自此开 ...
- (转)Delphi工程文件说明
1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...
- 简单获取input file 选中的图片,并在一个div的img里面赋值src实现预览图片
html代码: <input id="file_upload" type="file" /> <div class="image_c ...
- iOS - 富文本AttributedString
最近项目中用到了图文混排,所以就研究了一下iOS中的富文本,打算把研究的结果分享一下,也是对自己学习的一个总结. 在iOS中或者Mac OS X中怎样才能将一个字符串绘制到屏幕上呢? ...
- 谈谈我的编程之路---WAMP(三)
WAMP的一些配置与使用心得(APACHE)说实话,我感觉apache的配置真的还是蛮复杂的,感觉好像又在学一种语言,让我用比较庞大的概念来讲述这些东西,我也没办法做到就以实际应用出发出发,简单的说一 ...
- Genymotion
@Genymotion相关文件下载地址 http://pan.baidu.com/s/1nu9nReh @虚拟机网络代理设置 Normal 0 7.8 磅 0 2 false false false ...
- CLR via C#(13)-浅谈事件
提起事件,我们都不陌生,事件使类之间有了交互的能力.它是建立在委托基础上的.有了前面对委托的了解,相信读起事件来也不会太难了.关于事件,现成的好文章数不胜数,本不打算写了.不过问道有先后,各抒己见,也 ...
- 【翻译十七】java-并发之高性能对象
High Level Concurrency Objects So far, this lesson has focused on the low-level APIs that have been ...