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 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
May 10 Javascript
用JSON做数据传输格式中的一些问题总结
Dec 21 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
Oct 29 Javascript
document.compatMode的CSS1compat使用介绍
Apr 03 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
一个JavaScript防止表单重复提交的实例
Oct 21 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
Nov 12 Javascript
js流动式效果显示当前系统时间
May 16 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
vue组件jsx语法的具体使用
May 21 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 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 URL编码解码函数代码
2009/03/10 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
DOM 高级编程
2015/05/06 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python实现局域网内实时通信代码
2019/12/22 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
《值日生》教学反思
2014/02/17 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
产品质量承诺范本
2014/03/31 职场文书
2015年校长新年寄语
2014/12/08 职场文书
横店影视城导游词
2015/02/06 职场文书
医生个人年度总结
2015/02/28 职场文书
大学生暑假实习总结
2015/07/13 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
入门学习Go的基本语法
2021/07/07 Golang