共计 3578 个字符,预计需要花费 9 分钟才能阅读完成。
Express 路由模块
Express 的路由模块是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(比如 GET、POST 等)组成的,表示应用该如何响应客户端对指定 URI 的访问。
每一个路由都可以有一个或多个处理函数,当匹配到路由时,将执行相应的函数。
路由的定义由如下结构组成:
app.METHOD(PATH, HANDLER)
其中,app 表示一个 express 实例;METHOD 是 HTTP 的请求方法;PATH 是服务器端的路径, 即 URI;HANDLER 表示当路由匹配时需要执行的函数。比如:
app.get('/', function (req, res) {res.send('Hello World!');
});
// 网站首页接受 POST 请求
app.post('/', function (req, res) {res.send('Got a POST request');
});
// /user 节点接受 PUT 请求
app.put('/user', function (req, res) {res.send('Got a PUT request at /user');
});
// /user 节点接受 DELETE 请求
app.delete('/user', function (req, res) {res.send('Got a DELETE request at /user');
});
curl 测试
测试以上代码,用 curl 工具。
测试 GET 请求
$ curl -G http://localhost:3000/
或者用
curl -X GET http://localhost:3000/
测试 POST 请求
$ curl -d "" http://localhost:3000/
或者用
$ curl -X POST http://localhost:3000/
测试 PUT 请求
C:\>curl -X PUT http://localhost:3000/
测试 DELETE 请求
C:\>curl -X DELETE http://localhost:3000/
请求方法
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。
app.all()
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 的路由路径和请求方法一起定义了请求的端点,它可以是字符串、字符串模式或者正则表达式。
Express Route Tester 工具
Express 使用了 path-to-regexp 来匹配路由路径。另外,Express Route Tester 是测试基本 Express 路径的好工具,但它不支持模式匹配。
Express Route Tester 工具见 http://forbeslindesay.github.io/express-route-tester/
path-to-regexp 工具
path-to-regexp 是 Express 风格的路径正则工具,见 https://www.npmjs.com/package/path-to-regexp
Express 内部依赖了此工具,故无需单独安装。
path-to-regexp 的用法
var pathToRegexp = require('path-to-regexp')
// pathToRegexp(path, keys, options)
// pathToRegexp.parse(path)
// pathToRegexp.compile(path)
其中,
- path 指 express 格式中的一个字符串、或一个字符串数组、或一个正则表达式
- keys 指对 URL 中的关键词进行填充的数组
- options 有三个值:
- sensitive 如果为 true 表示 URL 是大小写敏感的,默认为 false
- strict 如果为 false 表示 URL 最后的斜线“/”是可省略的,默认为 false
- end 如果为 false 表示路径会从头匹配,默认为 false
path-to-regexp 中的参数
1)命名参数
命名此参数使用“:”加上参数名的方式来定义,比如“:foo”
2)后缀参数
- 可选的后缀参数
使用符号“?”再紧跟参数,说明整个参数是可选的,前面还可以结合“/”或“.”一起使用,比如:
‘’
var re = pathToRegexp('/:foo/:bar?', keys)
// keys = [{name: 'foo', ...}, {name: 'bar', delimiter: '/', optional: true, repeat: false}]
- 零到多个
使用“*”号
‘’
var re = pathToRegexp('/:foo*', keys)
// keys = [{name: 'foo', delimiter: '/', optional: true, repeat: true}]
- 1 到多个
使用“+”号
‘’
var re = pathToRegexp('/:foo+', keys)
// keys = [{name: 'foo', delimiter: '/', optional: false, repeat: true}]
- 自定义匹配参数
还可以用正则表达式自定义匹配参数。
‘’
var re = pathToRegexp('/:foo(\\d+)', keys)
// keys = [{name: 'foo', ...}]
- 未命名的参数
URL 中出现未命名的参数也是可以的,比如:
‘’
var re = pathToRegexp('/:foo/(.*)', keys)
// keys = [{name: 'foo', ...}, {name: '0', ...}]
- 星号
用星号“*”来匹配子路径的一切,比如:
‘’
var re = pathToRegexp('/foo/*', keys)
// keys = [{name: '0', ...}]
路径匹配例子:
// 匹配 /random.txt 路径的请求
app.get('/random.txt', function (req, res) {res.send('random.txt');
});
// 匹配 qcd 和 qbcd
app.get('/qb?cd', function(req, res) {res.send('qb?cd');
});
// 匹配 qbcd、qbbcd、qbbbcd 等
app.get('/qb+cd', function(req, res) {res.send('qb+cd');
});
// 匹配 qbcd、qbxcd、qbRABDOMcd、qb123cd 等
app.get('/qb*cd', function(req, res) {res.send('qb*cd');
});
// 匹配 /qbe 和 /qbcde
app.get('/qb(cd)?e', function(req, res) {res.send('qb(cd)?e');
});
// 匹配任何路径中含有 q 的路径:app.get(/q/, function(req, res) {res.send('/q/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man 等
app.get(/.*fly$/, function(req, res) {res.send('/.*fly$/');
});
Express 的链式路由
可使用 app.route() 创建路由路径的链式路由句柄。由于路径在一个地方指定,这样做有助于创建模块化的路由,而且减少了代码冗余和拼写错误。
app.route('/car')
.get(function(req, res) {res.send('Get a random car');
})
.post(function(req, res) {res.send('Add a car');
})
.put(function(req, res) {res.send('Update the car');
});
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-10/136412.htm