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 相关文章推荐
javascript JSON操作入门实例
Apr 16 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
修改好的jquery滚动字幕效果实现代码
Jun 22 Javascript
javascript的回调函数应用示例
Feb 20 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
jquery实现用户信息修改验证输入方法汇总
Jul 18 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
May 16 Javascript
在 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
一次编写,随处运行
2006/10/09 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
jQuery 选择器详解
2015/01/19 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
Python 连连看连接算法
2008/11/22 Python
python算法学习之计数排序实例
2013/12/18 Python
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
python魔法方法-自定义序列详解
2016/07/21 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
外贸业务员工作职责
2014/01/06 职场文书
校运会广播稿100字
2014/01/27 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
统计员岗位职责范本
2015/04/14 职场文书
体育委员竞选稿
2015/11/21 职场文书
听课评课活动心得体会
2016/01/15 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js