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 DOM 学习第七章 表单的扩展
Feb 19 Javascript
基于JavaScript 下namespace 功能的简单分析
Jul 05 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
原生js制作简单的数字键盘
Apr 24 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
Angularjs之filter过滤器(推荐)
Nov 27 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
Feb 15 Javascript
node静态服务器实现静态读取文件或文件夹
Dec 03 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 Javascript
原生js实现九宫格拖拽换位
Jan 26 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
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
JointJS流程图的绘制方法
2018/12/03 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
pandas将numpy数组写入到csv的实例
2018/07/04 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
详解Flask前后端分离项目案例
2020/07/24 Python
Python实现播放和录制声音的功能
2020/08/12 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
项目投资意向书
2014/04/01 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
职代会闭幕词
2015/01/28 职场文书
出国留学英文自荐信
2015/03/25 职场文书
离婚案件被告代理词
2015/05/23 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫