Null's Blog

express中的路由2

express 路由使用极其灵活,按照先挂载,先执行的顺序,路由处理可通过next()进行传递:
路由传递:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app.param('id', function (req, res, next, id) {
console.log('CALLED ONLY ONCE');
next();
})
app.get('/user/:id', function (req, res, next) {
console.log('although this matches');
next();
});
app.get('/user/:id', function (req, res) {
console.log('and this matches too');
res.end();
});
//最终输入如下:
//CALLED ONLY ONCE
//although this matches
//and this matches too

路由处理顺序,以本blog源码为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//app.js (挂载顺序)
info_routes(app);
list_routes(app);
article_routes(app);
login_routes(app);
post_routes(app);
//list.js
app.get('/:year/:month',function(req,res,next){
//do something()
});
//info.js
app.get('/:info(about|profile|links|booklist|tweets)?/add',function(req,res,next){
});

由于info先于list挂载至express实例(app),所以info.js的这个路由会先被执行,这里并没有使用next()进行路由传递,同样,info.js里的路由使用了正则进行匹配,官方示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 匹配 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$/');
});