Nodejs Express 4.X 中文API 4--- Router篇
相关阅读:
Express 4.X API 翻译[一] -- Application篇
Express4.XApi 翻译[二] -- Request篇
本篇是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);
});
Nodejs Express 4.X 中文API 4--- Router篇的更多相关文章
- Nodejs Express 4.X 中文API 1--- Application篇
相关阅读: Express 4.X API 翻译[一] -- Application篇 Express4.XApi 翻译[二] -- Request篇 Express4.XApi 翻译[三] -- ...
- Nodejs Express 4.X 中文API 3--- Response篇
相关阅读: Express 4.X API 翻译[一] -- Application篇 Express4.XApi 翻译[二] -- Request篇 Express4.XApi 翻译[三] -- ...
- Nodejs Express 4.X 中文API 2--- Request篇
相关阅读: Express 4.X API 翻译[一] -- Application篇 Express4.XApi 翻译[二] -- Request篇 Express4.XApi 翻译[三] -- ...
- nodejs 框架 中文express 4.xxx中文API手册
介于最近express 中文文档比较难找的现状,特地找了一个,供大家学习思考 Express 4.x API express 翻译 api文档 中文 -- express() expre ...
- NodeJs+Express+SqlServer简易后台API服务搭建
首先安装nodejs 第一步 创建node项目配置package.json如下 express 使用方法可参考http://www.runoob.com/nodejs/nodejs-express-f ...
- 【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate('oauth-bearer', {session: false})
问题描述 在前两篇博文中,对NodeJS Express应用 使用MSAL + AAD实现用户登录并获取用户信息,获取Authorization信息 ( ID Token, Access Token) ...
- nodejs+express+mongodb实现登录注册
nodejs+express+mongodb实现登录注册 1 简介 登录注册功能使用nodejs+express+mongodb完成,其中对mongodb的操作使用mongoose完成,对mongod ...
- NodeJS+Express+MongoDB 简单实现数据录入及回显展示【适合新人刚接触学习】
近期在看NodeJS相关 不得不说NodeJS+Express 进行网站开发是很不错,对于喜欢玩JS的来说真是很好的一种Web开发组合 在接触NodeJS时受平时Java或者C#中API接口等开发的思 ...
- NodeJS+Express+MongoDB
一.MongoDB MongoDB是开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序丰富:高伸缩性:MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言 ...
随机推荐
- php全角字符转换为半角函数 实例代码
PHP全角半角转换函数,把目前能找到的所有全角都列出来了一个个替换吧. 之前试过网上找的通过ASCII之类的字符替换,发现很多莫名其妙的问题.最后还是换成下面的字符替换方式了,把目前能找到的所有全角都 ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- 03-树2 List Leaves
二叉树及其遍历 一遍AC,挺开心的hhh~ 简单讲下思路:叶子,顾名思义就是没有左右子树的结点.由于题目要求,叶子结点的输出顺序是从上往下,从左往右.所以用层序遍历法. 当然,这里先找到root树的根 ...
- ruby cookbook
11.2 listing object's method Oject.methods/singleton_methods/instance_methods 指定类名定义的方法在 singleton_m ...
- centos6.4 安装 hive 0.12.0
环境:centos6.4 64bit, 前提:hadoop已经正常运行,可以使用hadoop dfsadmin -report查看 hive 解压 tar zcvf hive-0.12.0.ta ...
- [转]ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- iTween基础之Color(变换颜色)
一.基础介绍:二.基础属性 原文地址: http://blog.csdn.net/dingkun520wy/article/details/51065275 一.基础介绍 ColorTo:从当前颜色变 ...
- typedef和自定义结构体类型
在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列. /*定义单链表结点类型*/ ...
- ostream类重载的operator<<()函数
ostream类重载了operator<<()以识别不同的类型,如: int short long unsigned int unsigned short unsigned long f ...
- struts2异常记录--java.lang.IllegalStateException
java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFa ...