Express.js - единственный обработчик маршрутизации для нескольких маршрутов в одной строке

Есть ли способ сделать это на одном вызове функции?

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

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

Что-то вроде:

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

Я знаю, что это синтаксический беспорядок, но просто для того, чтобы дать представление о том, чего бы я хотел достичь, массив маршрутов был бы потрясающим!

Кто-нибудь знает, как это сделать?

Ответ 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 answer ниже.

Изменить 2: Это умеренно популярный ответ. Имейте в виду, что ExpressJS, как и большинство библиотек Node.js, является подвижным праздником. Хотя вышеописанная маршрутизация все еще работает (я использую ее в настоящий момент, очень удобная функция), я не могу ручаться за вывод объекта запроса (это, безусловно, отличается от того, что я описал). Пожалуйста, тщательно протестируйте, чтобы убедиться, что вы получите желаемые результаты.

Ответ 2

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

:var устанавливает req.param, который вы не используете. он используется только в этом случае для установки регулярного выражения.

(bla|blabla) устанавливает соответствие регулярному выражению, поэтому оно соответствует строкам bla и blablah.

? делает все регулярное выражение необязательным, поэтому оно также соответствует /.

Ответ 3

Фактически вы можете передать массив путей, как вы упомянули, и он отлично работает:

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

Ответ 4

Чтобы подробно описать ответ Кевина, это из 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. });
});

Ответ 6

требуется файл исходного маршрута и определить новый маршрут, подобный этому

var user = require('./users');
router.post('/login', user.post('/login'));