Express的路由详解


Posted in Javascript onDecember 10, 2015

路由

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。

路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback...], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。

下面是一个基本的路由示例:

var express = require('express');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
 res.send('hello world');
});

路由方法

路由方法源于 HTTP 请求方法,和 express 实例相关联。

下面这个例子展示了为应用跟路径定义的 GET 和 POST 请求:

// GET method route
app.get('/', function (req, res) {
 res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
 res.send('POST request to the homepage');
});

Express 定义了如下和 HTTP 请求对应的路由方法: get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search, 和 connect。

有些路由方法名不是合规的 JavaScript 变量名,此时使用括号记法,比如: app['m-search']('/', function ...
app.all() 是一个特殊的路由方法,没有任何 HTTP 方法与其对应,它的作用是对于一个路径上的所有请求加载中间件。

在下面的例子中,来自 “/secret” 的请求,不管使用 GET、POST、PUT、DELETE 或其他任何 http 模块支持的 HTTP 请求,句柄都会得到执行。

app.all('/secret', function (req, res, next) {
 console.log('Accessing the secret section ...');
 next(); // pass control to the next handler
});

路由路径

路由路径和请求方法一起定义了请求的端点,它可以是字符串、字符串模式或者正则表达式。

Express 使用 path-to-regexp 匹配路由路径,请参考文档查阅所有定义路由路径的方法。 Express Route Tester 是测试基本 Express 路径的好工具,但不支持模式匹配。
查询字符串不是路由路径的一部分。

使用字符串的路由路径示例:

// 匹配根路径的请求
app.get('/', function (req, res) {
 res.send('root');
});
// 匹配 /about 路径的请求
app.get('/about', function (req, res) {
 res.send('about');
});
// 匹配 /random.text 路径的请求
app.get('/random.text', function (req, res) {
 res.send('random.text');
});
使用字符串模式的路由路径示例:
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
 res.send('ab?cd');
});
// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
 res.send('ab+cd');
});
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
 res.send('ab*cd');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

字符 ?、+、* 和 () 是正则表达式的子集,- 和 . 在基于字符串的路径中按照字面值解释。
使用正则表达式的路由路径示例:

// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
 res.send('/a/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
 res.send('/.*fly$/');
});

路由句柄

可以为请求处理提供多个回调函数,其行为类似 中间件。唯一的区别是这些回调函数有可能调用 next('route') 方法而略过其他路由回调函数。可以利用该机制为路由定义前提条件,如果在现有路径上继续执行没有意义,则可将控制权交给剩下的路径。

路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合,如下所示.

使用一个回调函数处理路由:

app.get('/example/a', function (req, res) {
 res.send('Hello from A!');
});

使用多个回调函数处理路由(记得指定 next 对象):

app.get('/example/b', function (req, res, next) {
 console.log('response will be sent by the next function ...');
 next();
}, function (req, res) {
 res.send('Hello from B!');
});

使用回调函数数组处理路由:

var cb0 = function (req, res, next) {
 console.log('CB0');
 next();
}
var cb1 = function (req, res, next) {
 console.log('CB1');
 next();
}
var cb2 = function (req, res) {
 res.send('Hello from C!');
}
app.get('/example/c', [cb0, cb1, cb2]);

混合使用函数和函数数组处理路由:

var cb0 = function (req, res, next) {
 console.log('CB0');
 next();
}
var cb1 = function (req, res, next) {
 console.log('CB1');
 next();
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
 console.log('response will be sent by the next function ...');
 next();
}, function (req, res) {
 res.send('Hello from D!');
});

响应方法

下表中响应对象(res)的方法向客户端返回响应,终结请求响应的循环。如果在路由句柄中一个方法也不调用,来自客户端的请求会一直挂起。

Javascript 相关文章推荐
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
值得分享和收藏的Bootstrap学习教程
May 12 Javascript
select下拉框插件jquery.editable-select详解
Jan 22 Javascript
javascript表单正则应用
Feb 04 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
vue输入框使用模糊搜索功能的实现代码
May 26 Javascript
搭建vscode+vue环境的详细教程
Aug 31 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
在 Express 中使用模板引擎
Dec 10 #Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
Dec 10 #Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 #Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 #Javascript
详解AngularJS中module模块的导入导出
Dec 10 #Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 #Javascript
Spring mvc 接收json对象
Dec 10 #Javascript
You might like
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python从入门到精通(DAY 2)
2015/12/20 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python实现决策树分类(2)
2018/08/30 Python
Python基于百度云文字识别API
2018/12/13 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
数控技术应届生求职信
2013/11/13 职场文书
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
写给女生的道歉信
2014/01/08 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
财务工作失职检讨书
2014/11/21 职场文书
地球一小时活动总结
2015/02/27 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL