137

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

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

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

就像是:

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

我知道这是一个语法混乱,但只是为了让我了解我想要实现的目标,一组路线会很棒!

有人知道怎么做吗?

4

5 回答 5

160

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

@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"
}, 

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

因此,通过数组堆叠多条路径可以很容易地完成,但是如果您希望从通过参数或捕获组使用的路径中获取任何有用的东西,那么副作用可能是不可预测的。它可能对冗余/混叠更有用,在这种情况下它会很好地工作。

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

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

于 2014-09-26T11:18:48.090 回答
65
app.get('/:var(bla|blabla)?', todo)

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

(bla|blabla)将正则表达式设置为匹配,因此它匹配字符串blablablah.

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

于 2013-03-11T23:56:06.930 回答
58

就像您提到的那样,您实际上可以传入一个路径数组,并且效果很好:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
于 2013-06-17T19:52:59.063 回答
42

只是为了详细说明凯文的答案,这是来自4.x 文档

调用中间件函数的路径;可以是以下任何一种:

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

他们有一些例子,包括:

/abcd这将匹配以、/xyza/lmn和开头的路径/pqr

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
于 2016-06-02T16:01:39.130 回答
17

我去了一个:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
于 2016-11-30T22:18:16.620 回答