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

时间:2013-03-11 22:39:11

标签: 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 );

我知道这是一个语法混乱,但只是为了了解我想要实现的目标,一系列的路线将是非常棒的!

任何人都知道怎么做?

6 个答案:

答案 0 :(得分:84)

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

@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会发生什么:它知道所有可能路径中的捕获组和params,无论它们是否在当前请求中使用。

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

编辑:请同时查看@ c24w的回答below

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

答案 1 :(得分:50)

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

:var设置您不使用的req.param。它仅用于设置正则表达式。

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

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

答案 2 :(得分:46)

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

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

答案 3 :(得分:24)

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

  

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

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

他们有一些examples,包括:

  

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

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

答案 4 :(得分:6)

我去了:

center

答案 5 :(得分:0)

需要原始路线的文件,并像这样定义新路线

myapp.serialization.media_handler:
    class: Path\ToYourApp\Serializer\MediaSerializationHandler
    tags:
        - { name: jms_serializer.handler, type: Path\ToYourMedia\Entity\Media, direction: serialization, format: json, method: serializeMedia }
    arguments: [ @sonata.media.provider.image, @sonata.media.provider.file ]
相关问题