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式匹配,所以匹配stringblablablah

? 使整个正则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'));