express.js – 单行中多个路由的单个路由处理程序
有没有办法使这一个单一的函数调用?
var todo = function (req, res){}; app.get("/", todo); app.get("/blabla", todo); app.get("/blablablabla", todo);
就像是:
app.get("/", "/blabla", "/blablablabla", todo );
我知道这是一个混乱的语法,但只是想知道我想达到什么目的,一组路由将会非常棒!
有人知道怎么做吗?
我遇到这个问题,同时寻找相同的function。
@Jonathan Ong在上面的评论中提到,使用数组作为path已被弃用,但在Express 4中有明确的描述,并且在Express 3.x中可用。 以下是一个可以尝试的例子:
app.get( ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'], function ( request, response ) { } );
从request
对象中,用/hooplul/poo?bandle=froo&bandle=pee&bof=blarg
:
"route": { "keys": [ { "optional": false, "name": "farcus" } ], "callbacks": [ null ], "params": [ null, null, "lul" ], "regexp": {}, "path": [ "/test", "/alternative", "/barcus*", "/farcus/:farcus/", "/hoop(|la|lapoo|lul)/poo" ], "method": "get" },
注意params会发生什么:它知道所有可能path中的捕获组和参数,不pipe它们是否在当前请求中使用。
因此,通过数组堆叠多条path可以轻松完成,但是如果您希望从通过参数或捕获组使用的path中选取任何有用的东西,副作用可能是不可预测的。 这可能是更有用的冗余/别名,在这种情况下,它会工作得很好。
编辑:请参阅下面的 @ c24w的答案。
编辑2:这是一个适度stream行的答案。 请记住,与大多数Node.js库一样,ExpressJS是一个可移动的盛宴。 虽然上面的路由仍然有效(我现在正在使用它,这是一个非常方便的function),但是我不能保证请求对象的输出(这与我所描述的确实不同)。 请仔细testing以确保您获得理想的结果。
app.get('/:var(bla|blabla)?', todo)
:var
设置您不使用的req.param
。 它只用于这种情况下设置正则expression式。
(bla|blabla)
设置正则expression式匹配,所以匹配stringbla
和blablah
。
?
使整个正则expression式可选,所以它匹配/
以及。
实际上,您可以像上面提到的那样传递一组path ,而且效果很好:
var a = ['/', '/blabla', '/blablablabla']; app.get(a, todo);
只是要详细解释凯文的答案 ,这是来自4.x文档 :
中间件function被调用的path; 可以是以下任何一种:
- 表示path的string。
- path模式。
- 一个正则expression式模式来匹配path。
- 上述任何组合的数组。
他们有一些例子 ,包括:
这将匹配以
/abcd
,/xyza
,/lmn
和/pqr
开头的path:
app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) { next(); });
我去了一个:
['path', 'altPath'].forEach(function(path) { app.get(path, function(req, res) { etc. }); });
需要你的原始路线的文件,并像这样定义新的路线
var user = require('./users'); router.post('/login', user.post('/login'));