在使用express管理url时,我们希望能有一种更方便的管理方式,可以更加简化路由的管理,express router 就是完成这项功能的,。

路由器

使用router目的是中间件和路由的分离的实例。您可以将其视为“迷你应用程序”,只能执行中间件和路由功能。每个Express应用程序都有一个内置的应用程序路由器。

路由器的行为类似于中间件本身,因此您可以将其用作 app.use()的参数或作为另一个路由器的use()方法的参数。

顶级express对象具有一个用于创建新对象的Router()方法router

一旦你创建了一个路由器的对象,你可以添加中间件和HTTP方法路由(如getputpost,等),以它就像一个应用程序。例如:

var express = require('express');
var app = express();
var router = express.Router();
// invoked for any requests passed to this router
router.use(function(req, res, next) {// .. some logic here .. like any other middlewarenext();
});// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', function(req, res, next) {// ..
});

然后,您可以使用路由器来处理特定的根URL,从而将路由分成文件甚至是迷你应用程序。

// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', router);

方法

router.all(path,[callback,…] callback)

此方法与router.METHOD()方法类似,只是它匹配所有HTTP方法(动词)。

此方法对于映射特定路径前缀或任意匹配的“全局”逻辑非常有用。例如,如果将以下路由放在所有其他路由定义的顶部,则需要从该点开始的所有路由都需要身份验证,并自动加载用户。请记住,这些回调不必充当终点; loadUser 可以执行任务,然后调用next()以继续匹配后续路由。

router.all('*', requireAuthentication, loadUser);

或等效的:

router.all('*', requireAuthentication)
router.all('*', loadUser);

另一个例子是白名单的“全局”功能。这里的示例与之前非常相似,但它仅限制前缀为“/ api”的路径:

router.all('/api/*', requireAuthentication);

router.METHOD(path,[callback,…] callback)

这些router.METHOD()方法在Express中提供路由功能,其中METHOD是HTTP方法之一,例如GET,PUT,POST等,小写。因此,实际的方法是router.get()router.post()router.put(),等等。

除了之前未为路径调用的方法之外,还会router.get()自动为HTTP HEAD方法调用该函数。GET``router.head()``router.get()

您可以提供多个回调,并且所有回调都是平等对待的,并且行为就像中间件一样,除了这些回调可能会调用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);
});

router.param(名称,回调)

添加回调触发器以路由参数,其中name是参数的名称,并且callback是回调函数。虽然name从技术上讲是可选的,但从Express v4.11.0开始不推荐使用不带它的方法(见下文)。

回调函数的参数是:

  • req,请求对象。
  • res,响应对象。
  • next,表明下一个中间件功能。
  • name参数的值。
  • 参数的名称。

不同app.param()router.param()不接受一系列路由参数。

例如,当:user路径路径中存在时,您可以映射用户加载逻辑以自动提供req.user给路径,或者对参数输入执行验证。

router.param('user', function(req, res, next, id) {// try to get the user details from the User model and attach it to the request objectUser.find(id, function(err, user) {if (err) {next(err);} else if (user) {req.user = user;next();} else {next(new Error('failed to load user'));}});
});

Param回调函数是定义它们的路由器的本地函数。它们不是由已安装的应用程序或路由器继承的。因此,定义的param回调router只能由路由上定义的路由参数触发router

即使参数在多个路由中匹配,参数回调也只会在请求 - 响应周期中调用一次,如以下示例所示。

router.param('id', function (req, res, next, id) {console.log('CALLED ONLY ONCE');next();
});router.get('/user/:id', function (req, res, next) {console.log('although this matches');next();
});router.get('/user/:id', function (req, res) {console.log('and this matches too');res.end();
});

GET /user/42,打印以下内容:

CALLED ONLY ONCE
although this matches
and this matches too

以下部分介绍router.param(callback)了自v4.11.0起不推荐使用的内容。

router.param(name, callback)通过仅传递函数可以完全改变方法的行为router.param()。这个函数是如何自定义实现的router.param(name, callback)应该表现 - 它接受两个参数并且必须返回一个中间件。

此函数的第一个参数是应捕获的URL参数的名称,第二个参数可以是可用于返回中间件实现的任何JavaScript对象。

函数返回的中间件决定捕获URL参数时发生的行为。

在此示例中,router.param(name, callback)签名被修改为router.param(name, accessId)router.param()现在接受姓名和号码,而不是接受姓名和回调。

var express = require('express');
var app = express();
var router = express.Router();// customizing the behavior of router.param()
router.param(function(param, option) {return function (req, res, next, val) {if (val == option) {next();}else {res.sendStatus(403);}}
});// using the customized router.param()
router.param('id', 1337);// route to trigger the capture
router.get('/user/:id', function (req, res) {res.send('OK');
});app.use(router);app.listen(3000, function () {console.log('Ready');
});

在此示例中,router.param(name, callback)签名保持不变,但是代替中间件回调,已定义自定义数据类型检查功能以验证用户标识的数据类型。

router.param(function(param, validator) {return function (req, res, next, val) {if (validator(val)) {next();}else {res.sendStatus(403);}}
});router.param('id', function (candidate) {return !isNaN(parseFloat(candidate)) && isFinite(candidate);
});

router.route(路径)

返回单个路由的实例,然后您可以使用该实例来处理带有可选中间件的HTTP谓词。使用router.route()以避免重复路线的命名,因此输入错误。

基于上面的router.param()示例,以下代码显示了如何使用它 router.route()来指定各种HTTP方法处理程序。

var router = express.Router();router.param('user_id', function(req, res, next, id) {// sample user, would actually fetch from DB, etc...req.user = {id: id,name: 'TJ'};next();
});router.route('/users/:user_id')
.all(function(req, res, next) {// runs for all HTTP verbs first// think of it as route specific middleware!next();
})
.get(function(req, res, next) {res.json(req.user);
})
.put(function(req, res, next) {// just an example of maybe updating the userreq.user.name = req.params.name;// save user ... etcres.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.route(),中间件排序基于创建路径的时间,而不是基于方法处理程序添加到路径时。为此,您可以将方法处理程序视为属于添加它们的路径。

router.use([path],[function,…] function)

使用指定的中间件函数或函数,以及可选的安装路径path,默认为“/”。

此方法类似于app.use()。下面描述一个简单的例子和用例。有关更多信息,请参阅app.use()。

中间件就像一个管道管道:请求从定义的第一个中间件功能开始,并按照它们匹配的每个路径“中断”中间件堆栈处理。

var express = require('express');
var app = express();
var router = express.Router();// simple logger for this router's requests
// all requests to this router will first hit this middleware
router.use(function(req, res, next) {console.log('%s %s %s', req.method, req.url, req.path);next();
});// this will only be invoked if the path starts with /bar from the mount point
router.use('/bar', function(req, res, next) {// ... maybe some additional /bar logging ...next();
});// always invoked
router.use(function(req, res, next) {res.send('Hello World');
});app.use('/foo', router);app.listen(3000);

“mount”路径被剥离,中间件功能可见。此功能的主要作用是,无论其“前缀”路径名如何,安装的中间件功能都可以在没有代码更改的情况下运行。

您定义中间件的顺序router.use()非常重要。它们按顺序调用,因此顺序定义了中间件优先级。例如,通常记录器是您将使用的第一个中间件,因此每个请求都会被记录。

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

现在假设您想忽略静态文件的日志记录请求,但是要继续记录之后定义的路由和中间件logger()express.static()在添加记录器中间件之前,您只需将调用移至顶部:

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.use()方法还支持命名参数,以便其他路由器的挂载点可以从使用命名参数的预加载中受益。

注意:虽然这些中间件功能是通过一个特定的路由器加入, 它们运行是由它们所连接到路径(而不是路由器)中所定义。因此,如果路由匹配,则通过一个路由器添加的中间件可以运行其他路由器。例如,此代码显示安装在同一路径上的两个不同的路由器:

var authRouter = express.Router();
var openRouter = express.Router();authRouter.use(require('./authenticate').basic(usersdb));authRouter.get('/:user_id/edit', function(req, res, next) { // ... Edit user UI ...
});
openRouter.get('/', function(req, res, next) { // ... List users ...
})
openRouter.get('/:user_id', function(req, res, next) { // ... View user ...
})app.use('/users', authRouter);
app.use('/users', openRouter);

即使通过authRouter它添加了身份验证中间件,它也将在由openRouter两个路由器安装的路由上运行/users。要避免此行为,请为每个路由器使用不同的路径。

express router路由管理中间件相关推荐

  1. Vue Router 路由管理

    文章目录 Vue Router 路由管理 概述 安装 简单使用 定义2个组件 定义路由信息 支持路由 使用路由 动态路由 配置动态路由 配置404 限制动态参数 嵌套路由 命名路由 编程式导航 简单使 ...

  2. Vue Router路由管理器

    目录: 相关理解 基本路由 几个注意事项 嵌套(多级)路由 路由的query参数 命名路由 路由的params参数 路由的props配置 路由跳转的replace方法 编程式路由导航 缓存路由组件 a ...

  3. express路由管理的几种自动化方法分享-js教程-PHP中文网

    我们平时在使用express写代码的过程中,会根据类别,将路由分为多个不同的文件,然后在项目的入口文件(例如app.js)中将其依次挂载,例如: 1 2 3 4 5 6 7 const index = ...

  4. node.js express php,nodejs开发——express路由与中间件

    路由 通常HTTP URL的格式是这样的: http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资源的URI(Uniform Resource Id ...

  5. express 框架之 路由与中间件

    1.  什么是router路径,什么是middleware? 我们输入www.baidu.com 来访问百度的主页,浏览器会自动转换为 http://www.baidu.com:80/(省略一些参数) ...

  6. nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

    nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] h ...

  7. express 路由中间件_Express通过示例进行解释-安装,路由,中间件等

    express 路由中间件 表达 (Express) When it comes to build web applications using Node.js, creating a server ...

  8. 渲染静态页面、get请求、post请求、express框架、路由、中间件

    1. 渲染静态页面 const http = require('http'); const fs = require('fs'); const url = require('url'); const ...

  9. 在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案

    在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案 参考文章: (1)在nodeJs的Express框架下用TypeScript编写ro ...

  10. Vue中路由管理器Vue Router使用介绍(三)

    2019独角兽企业重金招聘Python工程师标准>>> 一.路由定义添加动态参数定义 1.路由定义项,使用:xx 方式 定义动态参数 {path:'/user/:id/:name', ...

最新文章

  1. mysql-5.5.25_Linux下安装Mysql-5.5.25
  2. 重磅!教育部再次审批179所高校新增本科AI专业
  3. Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
  4. 从支付宝看大用户规模互联网架构发展
  5. 红帽赞助的Linux发行版Fedora 33刚刚发布
  6. odoo tree视图 当页不弹窗显示方法
  7. 在win10上使用Vmware安装Mac OS
  8. python中or关键字在变量赋值时的用法
  9. redis 系列7 数据结构之跳跃表
  10. 使用Azure Data Factory优雅的迁移SQL Server 2000 DTS包
  11. 双非本科逆袭 拿下ACM金牌、字节和旷视offer、保研985!
  12. 正大国际琪貨召主涨沪:期货交易止损方法主要有那些
  13. java 造数据_java测试造数据神器JavaFaker
  14. Excel函数大全-10查找和引用函数
  15. 物联卡中心:电信物联卡怎么办理,电信物联卡官网
  16. 操作系统 FIFO 先进先出页面置换算法
  17. 条形码识别Matlab版本
  18. linux恶意代码检查软件,Yara:恶意软件检测神器
  19. 5500xt挖矿算力_(视频)静态计算 RTX 3080 的以太坊挖矿回本周期 白露矿业报告 (20.09.19)...
  20. Linux 进程管理工具:supervisor

热门文章

  1. 开始防破解--该死的杀毒软件
  2. 2018年手机ODM行业分析
  3. Vue 编写(preventReClick)防暴点 +防抖(debounce)和节流(throttle)函数
  4. 计算机报名503,503 service temporarily unavailable是什么意思【解决方法】
  5. 缓解眼睛疲劳,护眼调节色温软件推荐
  6. 计算机1M代表什么,1M网速是多少 Mbps是什么意思
  7. jQuery插件-Slider轮播图
  8. 完全卸载VMware
  9. 基于百度翻译api的命令行翻译助手
  10. 【渝粤题库】陕西师范大学202291商业银行经营学作业(高起专)