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 相关文章推荐
IE php关于强制下载文件的代码
Aug 23 Javascript
jquery text()要注意啦
Oct 30 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
jQuery语法小结(超实用)
Dec 31 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
详解使用nvm安装node.js
Jul 18 Javascript
vue中created和mounted的区别浅析
Aug 13 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
Python写入数据到MP3文件中的方法
2015/07/10 Python
python机器学习之神经网络(三)
2017/12/20 Python
Python编写一个优美的下载器
2018/04/15 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Python更新所有已安装包的操作
2020/02/13 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
介绍一下sql server的安全性
2014/08/10 面试题
班组长竞聘书
2014/03/31 职场文书
报告会主持词
2014/04/02 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
神秘岛读书笔记
2015/07/01 职场文书
人民币使用说明书
2019/04/17 职场文书