相关阅读:

Express 4.X API 翻译[一] --  Application篇

Express4.XApi 翻译[二] --  Request篇

Express4.XApi 翻译[三] --- Response篇

Express4.XApi 翻译[四] --- Router篇

本篇是Express 4.0 API翻译的第四篇,本篇的内容主要是Router的相关操作。

Router()

路由器是一个孤立的中间件和路由的实例。路由器可以被认为是一个”mini”的应用程序,仅能执行中间件和路由选择。每一个Express程序都都会有一个内置的应用路由器。

路由器的行为就像是一个中间件自身一样你可以使用通过应用或者是在其他的路由规则内。

创建一个新的路由器通过使用”express.Router()”

 
 var router = express.Router();

路由器可以是有中间件,添加http动态路由就像是一个程序。

 
 //适配任何路由规则请传递给这个路由器。
router.use(function(req,res,next){
// ... 一些中间的逻辑操作,就像其他的中间件。
next();
});
//当处理任何以"/events"结束的请求
//取决于路由器在哪里被使用。
router.get('/events',function(req,res,next){
//....
});

然后你可以使用一个路由器为一个特定的根URL这样分离您的路由来进入文件甚至是mini 应用。

 
 //只有当请求 "/calendar/*"将会被发送到"router"
app.use('/calendar',router);

router.use([path],function)

使用被给定的中间件function,带有可选参数的挂载path,默认被挂载在’/’

中间件就像是一个管道,请求开始时从第一个被定义的中间件开始,顺着这个线路一直向下,匹配每一个满足条件的路由。

 
 var express = require('express');
var app = express();
var router = express.Router(); //一个简单的路由访问日志记录器
//所有请求都会首先触及这个中间件
router.use(function(req,res,next){
console.log('%s %s %s',req.method,req.url,req.path);
next();
}); //这个规则将只会被path的结尾为/bar的请求调用
router.use('/bar',function(req,res,next){
//...或许这里可以附加一些额外的/bar的日志记录......
next();
}); //总是被调用
router.use(function(req,res,next){
res.send('Hello World');
}); app.use('/foo',router);
app.listen(3000);

“绑定”的路径是被剥离的以及中间件函数是不可见的。这主要影响到被绑定的中间件将会在只要后缀确定的情况下,不管前缀是什么样子都会被执行。

这样,中间件使用”router.use()”被”定义”的顺序将会是非常重要的,它们是被顺序调用的,因此这将定义中间件的优先级。例如通常”express.logger()”是您想最先调用的中间件,来记录所有的请求。

 
 router.use(logger());
router.use(express.static(__dirname + '/public'));
router.use(function(req,res){
res.send('Hello');
});

那么现在假若您不想记录静态文件的请求,但是又想继续记录路由和中间件的请求,你可以简单的将静态文件定义移到logger()上。

 
 router.use(express.static(__dirname + '/public'));
router.use(logger());
router.use(function(req,res){
res.send('Hello');
});

另一个具体的例子是利用多文件目录提供静态文件服务,给予”/public”的优先级高于其他的目录。

 
 app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/files'));
app.use(express.static(__dirname + '/uploads'));

router.param([name],callback)

逻辑映射到参数。例如当’:user’存在于路由路径,你可以映射用户加载逻辑来自动为这个路由的提供req.user,或者执行参数输入验证。

下面的代码片段说明了callback是如何的像中间件,因此支持异步操作,然而假如这个参数的值在这里被命名为id。企图执行加载用户信息,然后分配给req.user,否则传递一个错误给next(err).

重要的是要意识到任何路由触发了被命名为的参数回调函数将会被顺序执行,如果next没有被传递一个error在上一级。

 
 router.param('user',function(req,res,next,id){
User.fine(id,function(err,user){
if(err){
return next(err);
}
else if(!user){
return next(new Error('failed to load user'));
} req.user = user;
next();
});
}); //这个路由使用了被命名为为':user'的参数
//这将被导致'user'参数回调函数将会被触发
router.get('/users/:user',function(req,res,next){
//req.user 将会在执行到这里时已经被定义
//如果这里有任何错误或者是正常的错误处理将会被触发。
//这个函数将不会被执行。
});

或者你将只传递一个回调函数,在这种情况下,你将有机会改变router.param()的api。例如express-params定义了下面的回调函数,你可以限制参数给定的正则表达式。

这个例子有点先进,检查第二个参数是否为正则表达式,返回一个行为类似于”user”参数例子的回调函数。

 
 router.param(function(name,fn){
if(fn instanceof RegExp){
return function(req,res,next,val){
var captures;
if(captures = fn.exec(String(val))){
req.params[name] = captures;
next();
}else{
next('route');
}
}
}
});

这个方法可以被用来验证参数的有效性,或者可以解析它们到提供的捕捉组。

 
 router.param('id',/^\d+$/);

 router.get('/user/:id',function(req,res){
res.send('user' + req.params.id);
}); router.param('range',/^(\w+)\.\.(\w+)?$/); router.get('/range/:range',function(req,res){
var range = req.params.range;
res.send('from ' + range[1] + ' to '+ range[2]);
});

router.use() 方法还支持命名参数,因此你的其他路由规则挂载点也可以使用这个命名参数。

router.route(path)

返回一个路由的一个实例,你可以用于处理HTTP动态请求使用可选的中间件。使用router.route()是一种推荐的方法来避免重复路由命名和拼写错误.。

基于router.param()之前的例子,我们看到router.route()使我们能够容易地指定各种HTTP动态处理程序。

 var router = express.Router();

 router.param('user_id',function(req,res,next,id){
//以下是示例用户,可以从数据库....等中获取
req.user = {
id: id,
name:'TJ'
};
next();
}); router.route('/user/:user_id')
.all(function(req,res,next){
//运行在说有http动态请求
//可以认为它是特定的路由中间件
})
.get(function(req,res,next){
res.json(req.user);
})
.put(function(req,res,next){
//仅仅是一个例子,可以是更新用户
req.user.name = req.params.name;
//保存用户....等
res.json(req.user);
})
.post(function(req,res,next){
next(new Error('not implemented'));
})
.delete(function(req,res,next){
next(new Error('not implemented'));
});
 

该方法重新使用’/users/:user_id’对于不同的HTTP动态请求路径和添加处理程序。

router.VERB(path,[callback...],callback)

router.VERB()方法提供路由功能在Express,这里的VERB是HTTP动态请求的一中,就好像router.post()。多种回调函数可以被给定,所有的都将被平等对待,这种行为就像是中间件,但不同的是这些”中间件”可以调用next(‘route’)来绕过剩下的回调函数。这种机制可用于执行先决条件路线然后将控制传递给后续的路线当这里没有继续匹配的路线时。

以下代码片段演示了最简单的路由定义。Express将路径转义为正则表达式,在内部使用匹配传入的请求。请求字符串将不被考虑在执行匹配的过程中,例如 “GET /”将会匹配下面的规则,同样”/GET /?name=tobi”将也会被匹配。

 
 router.get('/',function(req,res){
res.send('hello world');
});

正则表达式同样可以被使用,如果你有一些特殊的限制,正则表达式会是相当有用的,例如下面的代码将会匹配”GET /commits/71dbb9c” 同样也会匹配”GET /commits/71dbb9c..4c084f9″。

 
 router.get(/^\/commits\/(\w+)(?:\.\.(\w+))?$/,function(req,res){
var from = req.params[0];
var to = req.params[1] || 'HEAD';
res.send('commit range ' + from +'...' + to);
});

转自:http://www.90it.net/expressjs-api-4-zh-cn-router.html

Nodejs Express 4.X 中文API 4--- Router篇的更多相关文章

  1. Nodejs Express 4.X 中文API 1--- Application篇

    相关阅读: Express 4.X API 翻译[一] --  Application篇 Express4.XApi 翻译[二] --  Request篇 Express4.XApi 翻译[三] -- ...

  2. Nodejs Express 4.X 中文API 3--- Response篇

    相关阅读: Express 4.X API 翻译[一] --  Application篇 Express4.XApi 翻译[二] --  Request篇 Express4.XApi 翻译[三] -- ...

  3. Nodejs Express 4.X 中文API 2--- Request篇

    相关阅读: Express 4.X API 翻译[一] --  Application篇 Express4.XApi 翻译[二] --  Request篇 Express4.XApi 翻译[三] -- ...

  4. nodejs 框架 中文express 4.xxx中文API手册

       介于最近express 中文文档比较难找的现状,特地找了一个,供大家学习思考 Express 4.x API express 翻译 api文档 中文 --     express() expre ...

  5. NodeJs+Express+SqlServer简易后台API服务搭建

    首先安装nodejs 第一步 创建node项目配置package.json如下 express 使用方法可参考http://www.runoob.com/nodejs/nodejs-express-f ...

  6. 【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate('oauth-bearer', {session: false})

    问题描述 在前两篇博文中,对NodeJS Express应用 使用MSAL + AAD实现用户登录并获取用户信息,获取Authorization信息 ( ID Token, Access Token) ...

  7. nodejs+express+mongodb实现登录注册

    nodejs+express+mongodb实现登录注册 1 简介 登录注册功能使用nodejs+express+mongodb完成,其中对mongodb的操作使用mongoose完成,对mongod ...

  8. NodeJS+Express+MongoDB 简单实现数据录入及回显展示【适合新人刚接触学习】

    近期在看NodeJS相关 不得不说NodeJS+Express 进行网站开发是很不错,对于喜欢玩JS的来说真是很好的一种Web开发组合 在接触NodeJS时受平时Java或者C#中API接口等开发的思 ...

  9. NodeJS+Express+MongoDB

    一.MongoDB MongoDB是开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序丰富:高伸缩性:MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言 ...

随机推荐

  1. android里面线程睡眠事件使用方法

    SystemClock.sleep(时间); 不用Thread.sleep()的原因:要抛异常,占用资源

  2. Struts2中的namespace使用

    namespace一般在项目比较复杂的情况下使用较好. 在struts2的项目中,namespace主要在以下环境中常使用: 1. 在配置文件中(struts.xml)以及被它包含的XX.xml文件中 ...

  3. Java 数组操作

    参考了网上别人的代码,在Java中对数组的比较便利的操作是 将数组转换成集合再利用集合所提供的add remove等方法进行增删,然后再转换成原数组类型 如 String[] --> 填充至 A ...

  4. C#高级功能(一)Lambda 表达式

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ ...

  5. openstack的控制节点部署

    openstack的控制节点部署 主要是使用了本地安装的那个镜像. 会出现几个问题, 1.重启服务无法启动. 2.环境变量无法正确配置可以自己配置

  6. 分享O'Reilly最新C语言指针数据

    1.推荐书名 Understanding.and.Using.C.Pointers.pdf 2. 本书目录 Table of Content Chapter 1. Introduction Chapt ...

  7. ListView用法及加载数据时的闪烁问题和加载数据过慢问题

    ListView介绍及添加数据时的闪烁问题 1.     ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示 ...

  8. Java生成唯一的ID

    public class UIDGenerator { private static Date date = new Date(); private static StringBuilder buf ...

  9. SaaS应用“正益工作”发布,为大中型企业轻松构建移动门户

    6月24日,以“平台之上,应用无限”为主题的2016 AppCan移动开发者大会,在北京国际会议中心隆重举行,逾1500名移动开发者一起见证了此次大会盛况. 会上,在专家领导.技术大咖.移动开发者的共 ...

  10. [转]Cygwin的包管理器:apt-cyg

    [转]Cygwin的包管理器:apt-cyg http://zengrong.net/post/1792.htm Cygwin的包管理工具setup.exe实在是难用的让人蛋碎.于是就有了这样一个ap ...