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

Node.js express.js-一行中多个路由的单个路由处理程序,node.js,regex,express,routing,Node.js,Regex,Express,Routing,有没有一种方法可以在单个函数调用中实现这一点 var todo = function (req, res){}; app.get("/", todo); app.get("/blabla", todo); app.get("/blablablabla", todo); 比如: app.get("/", "/blabla", "/blablablabla", todo ); 我知道这是一个语法混乱,但仅仅为了给我一个想法,我想实现,一系列的路线将是可怕的 有人知道怎么做吗 app.get('

有没有一种方法可以在单个函数调用中实现这一点

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

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

app.get("/", "/blabla", "/blablablabla", todo );
我知道这是一个语法混乱,但仅仅为了给我一个想法,我想实现,一系列的路线将是可怕的

有人知道怎么做吗

app.get('/:var(bla|blabla)?', todo)
:var
设置不使用的
req.param
。它仅在本例中用于设置正则表达式

(bla | blabla)
设置要匹配的正则表达式,以便它匹配字符串
bla
blablah


使整个正则表达式成为可选的,因此它也与
/
匹配。

您实际上可以传递一组路径,就像您提到的那样,它工作得非常好:

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

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

@Jonathan Ong在上面的评论中提到,不推荐使用数组作为路径,但在Express 4中有明确的描述,并且在Express 3.x中也可以使用。下面是一个可以尝试的示例:

app.get(
['/test'、'/alternative'、'/barcus*'、'/farcus/:farcus/'、'/hoop(| la | lapoo | lul)/poo'],
功能(请求、响应){
}
);
请求
对象内部,路径为
/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会发生什么:它知道所有可能路径中的捕获组和params,无论它们是否在当前请求中使用

因此,通过阵列堆叠多条路径很容易,但如果您希望从通过参数或捕获组使用的路径中获取任何有用的信息,则副作用可能无法预测。对于冗余/别名,它可能更有用,在这种情况下,它会工作得很好

编辑:请参见@c24w的答案

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

以下是详细说明:

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

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

他们有一些建议,包括:

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

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
我去参加了一个:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});

您应该能够编写一个正则表达式,该表达式将匹配要路由到todo的所有路由,并将正则表达式用作端点。它可能会看起来一团糟,但它会起作用。我不想把它作为一个答案,因为我不确定正则表达式是什么,这更像是向那个方向推进。这里提到了在文档中使用正则表达式:我没有在JS中使用正则表达式的经验。。。我试试看。。。但任何其他选择都是受欢迎的!我也没有太多,老实说,这就是为什么我没有把它给你,然而我的理解是正则表达式是相当普遍的;Express应该像其他语言一样解析表达式。正则表达式非常强大,绝对值得学习。这里有一个解决方案:app.get(/^\/((blabla){0,2})$/,function(req,resp){var matched=req.params[0];resp.set('Content-type','text/plain').send(“matched:'+matched+”);});有两件事:1。正则表达式以/开头和结尾,因此必须转义所有/字符。2.^char匹配字符串的开头,$char匹配字符串的结尾。如果没有它们,即使在路径的开始或结束处有额外的字符,也会成功匹配,即/x/Blablaxxx这个被弃用的字符的替代物是什么?@JonathanOng你说这个被弃用了,remus问这个替代物是什么。您能回答他/她的问题吗?router.route(['/mailer/out/system','/mailer/out/payment'])在express 4中运行正常,无需弃用warning@JonathanOng使用数组查看当前的Express v4文档似乎没有被弃用。
/bla(bla)?
也可以工作,但之后的任何参数都无法正确填充(即
/bla(bla)?/:value
不填充
req.params.value
)。有人知道为什么吗?如果您使用express,您可以使用
req.params.var
获得它,但您需要确保已将
req
传递给函数