express.js-单个行中多个路由的单个路由处理程序


107

有没有办法在单个函数调用上做到这一点?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

就像是:

app.get("/", "/blabla", "/blablablabla", todo );

我知道这是一个语法混乱,但是仅仅为了给出我想要实现的目标的思路,一系列路由就很棒了!

有人知道怎么做吗?


2
您应该能够编写一个正则表达式,该正则表达式将与您要路由到待办事项的所有路由匹配,并使用该正则表达式作为端点。它可能看起来看起来很凌乱,但是可以工作。我没有将其发布为答案,因为我不确定正则表达式将是什么,而这更多地是朝这个方向的推动。这里提到在文档中使用正则表达式:expressjs.com/api.html#app.VERB
Nick Mitchinson 2013年

我没有在JS中使用正则表达式的经验...请尝试一下...但是欢迎其他选择!
阿罗尼斯·马里亚诺

1
我也没有太多,这就是为什么我不只是把它给你,但是我的理解是正则表达式相当普遍。Express应该与其他任何语言一样解析您的表达式。
尼克·米奇森

1
正则表达式非常强大,绝对值得学习。这是一个解决方案:app.get(/ ^ \ /((blabla){0,2})$ /,function(req,resp){var matching = req.params [0]; resp .set('Content- type','text / plain').send(“ Matched:'” + matched +“'”);}); 有两件事:1.正则表达式以/开头和结尾,因此任何/字符都必须转义。2. ^ char匹配字符串的开头,$ char匹配字符串的结尾。没有它们,即使在路径的开头或结尾出现多余的字符,比赛也将成功,例如/ x / blablaxxx
John Deighan

Answers:


130

我在寻找相同功能时遇到了这个问题。

@Jonathan Ong在上面的评论中提到过,不建议将数组用于路径,但是在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"
}, 

注意参数会发生什么:知道所有可能路径中的捕获组和参数,无论它们是否在当前请求中使用。

因此,可以很容易地通过数组堆叠多个路径,但是如果您希望从通过参数或捕获组使用的路径中拾取有用的任何东西,则副作用可能是无法预料的。对于冗余/别名,它可能更有用,在这种情况下,它将很好地工作。

编辑:请参阅下面的 @ c24w的答案。

编辑2:这是一个比较受欢迎的答案。请记住,与大多数Node.js库一样,ExpressJS是可移动的盛宴。尽管上面的路由仍然有效(目前我正在使用它,这是一个非常方便的功能),但我不能保证请求对象的输出(这肯定与我所描述的有所不同)。请仔细测试以确保获得所需的结果。


奇迹般有效。谢谢。
OrAssayag

58
app.get('/:var(bla|blabla)?', todo)

:var设置req.param您不使用的。它仅在这种情况下用于设置正则表达式。

(bla|blabla)将正则表达式设置为匹配,以便匹配字符串blablablah

?使整个正则表达式为可选,因此也匹配/


1
/bla(bla)?也可以,但是之后的任何参数都无法正确填充(即/bla(bla)?/:value,不会填充req.params.value)。有人知道为什么吗?
joscarsson

如果您使用表达你可以得到它req.params.var,但你需要确保你req传递给函数
马特忍者

51

就像您提到的那样,您实际上可以传递一系列路径,并且效果很好:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
不推荐使用什么替代品?
brandonscript 2014年

5
@JonathanOng您说这已经过时了,remus在问替代什么。你能回答他/她的问题吗?
nbro

router.route(['/ mailer / out / system','/ mailer / out / payment'])在express 4中工作正常,没有弃用警告
danday74 '16

2
@JonathanOng使用数组查看当前Express v4文档似乎已被弃用。
杰森·阿克森

32

为了详细说明Kevin的答案,这是来自4.x docs

调用中间件功能的路径;可以是以下任何一个:

  • 表示路径的字符串。
  • 路径模式。
  • 匹配路径的正则表达式模式。
  • 以上任何组合的数组。

他们有一些示例,包括:

这将匹配路径开始/abcd/xyza/lmn,和/pqr

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.