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中定义对象类别
Dec 22 Javascript
jquery tools 系列 scrollable(2)
Sep 06 Javascript
让AJAX不依赖后端接口实现方案
Dec 03 Javascript
不同Jquery版本引发的问题解决
Oct 14 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
原生node.js案例--前后台交互
Feb 20 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
js实现小星星游戏
Mar 23 Javascript
vue实现拖拽交换位置
Apr 07 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
php Smarty模板生成html文档的方法
2010/04/12 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP getName()函数讲解
2019/02/03 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
jquery实现数字输入框
2017/02/22 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
高三霸气励志标语
2014/06/24 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书