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入门学习资料收集整理篇
Jul 06 Javascript
JS中类或对象的定义说明
Mar 10 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
javascript动态设置样式style实例分析
May 13 Javascript
js实现发送验证码后的倒计时功能
May 28 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
Jan 04 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
Smartour 让网页导览变得更简单(推荐)
Jul 19 Javascript
js实现多图和单图上传显示
Dec 18 Javascript
vue-cli设置publicPath小记
Apr 14 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
PHP4之COOKIE支持详解
2006/10/09 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python的常用模块之collections模块详解
2018/12/06 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
英语一分钟演讲稿
2014/04/29 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
2015年化验室工作总结
2015/04/23 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技