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

Aro*_*ano 94 regex routing node.js express

有没有办法在单个函数调用上进行此操作?

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

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);
Run Code Online (Sandbox Code Playgroud)

就像是:

app.get("/", "/blabla", "/blablablabla", todo );
Run Code Online (Sandbox Code Playgroud)

我知道这是一个语法混乱,但只是想知道我想要实现什么,一系列的路线将是真棒!

有人知道怎么做吗?

Kev*_*eur 101

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

@Jonathan Ong在上面的评论中提到,不推荐使用路径数组,但它在Express 4中有明确描述,它适用于Express 3.x. 这是一个尝试的例子:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);
Run Code Online (Sandbox Code Playgroud)

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"
}, 
Run Code Online (Sandbox Code Playgroud)

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

因此,可以轻松地通过阵列堆叠多个路径,但如果您希望从通过params或捕获组使用的路径中获取有用的任何内容,那么副作用可能是不可预测的.它可能对冗余/混叠更有用,在这种情况下它可以很好地工作.

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

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


Jon*_*Ong 54

app.get('/:var(bla|blabla)?', todo)
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 47

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

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Run Code Online (Sandbox Code Playgroud)

  • 什么是被弃用的替代品? (28认同)
  • @JonathanOng你说这个已经弃用了,_remus_正在问什么是替代品.你能回答他/她的问题吗? (5认同)
  • @JonathanOng使用数组查看当前Express v4文档似乎已被弃用。 (2认同)

c24*_*24w 27

只是详细说明Kevin的答案,这是来自4.x文档:

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

  • 表示路径的字符串.
  • 路径模式.
  • 用于匹配路径的正则表达式模式.
  • 任何上述组合的阵列.

他们有一些例子,包括:

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

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


Aug*_*ger 7

我去了:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Run Code Online (Sandbox Code Playgroud)