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

Posted

技术标签:

【中文标题】express.js - 单行中多个路由的单个路由处理程序【英文标题】:express.js - single routing handler for multiple routes in a single line 【发布时间】:2013-02-27 07:18:55 【问题描述】:

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

var todo = function (req, res);

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

类似:

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

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

有人知道怎么做吗?

【问题讨论】:

你应该能够编写一个正则表达式来匹配你想要路由到 todo 的所有路由,并使用正则表达式作为你的端点。它可能最终看起来很乱,但它会起作用。我没有将其发布为答案,因为我不确定正则表达式是什么,这更像是朝着这个方向发展。这里的文档中提到了使用正则表达式:expressjs.com/api.html#app.VERB 我没有在 JS 中使用正则表达式的经验...我试试...但欢迎任何其他选择! 我也没有太多,老实说,这就是为什么我不把它给你,但我的理解是正则表达式是相当普遍的; Express 应该像解析任何其他语言一样解析您的表达式。 正则表达式非常强大,绝对值得学习。这是一个解决方案: app.get(/^\/((blabla)0,2)$/, function(req, resp) var mapped = req.params[0]; resp .set('Content- type', 'text/plain') .send("匹配: '" + 匹配 + "'"); );有几件事: 1. 正则表达式以 / 开头和结尾,因此必须转义任何 / 字符。 2. ^ 字符匹配字符串的开头,$ 字符匹配字符串的结尾。没有它们,即使在路径的开头或结尾有多余的字符,匹配也会成功,即 /x/blablaxxx 【参考方案1】:

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

@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 的回答below。

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

【讨论】:

【参考方案2】:
app.get('/:var(bla|blabla)?', todo)

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

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

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

【讨论】:

/bla(bla)? 也可以工作,但是之后的任何参数都不能正确填充(即/bla(bla)?/:value 不能填充req.params.value)。有人知道为什么吗? 如果您使用 express,您可以使用 req.params.var 获取它,但您需要确保已将 req 传递给函数【参考方案3】:

你实际上可以传入一个路径数组,就像你提到的那样,它工作得很好:

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

【讨论】:

这个被弃用的替代品是什么? @JonathanOng 你说这已被弃用,而 remus 正在询问什么是替代品。你能回答他/她的问题吗? router.route(['/mailer/out/system', '/mailer/out/payment']) 在 express 4 中运行良好,没有弃用警告 @JonathanOng 使用数组查看当前 Express v4 文档似乎没有被弃用。【参考方案4】:

只是详细说明Kevin's answer,这是来自4.x docs:

中间件函数被调用的路径;可以是:

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

他们有一些examples,包括:

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

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

【讨论】:

【参考方案5】:

我去了:

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

【讨论】:

以上是关于express.js - 单行中多个路由的单个路由处理程序的主要内容,如果未能解决你的问题,请参考以下文章

express.js 路由模块化

Express.js 或 Angular 用于在 MEAN 应用程序中处理路由?

如何保护 express.js 中的路由?

使用 express.js 动态加载路由

使用 Express JS 路由中的 Socket.io

使用 Express.js 在 Node.js 中设置路由的最佳方式