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

111

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

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

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

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

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

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

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

Аронис Мариано
источник
2
Вы должны иметь возможность написать регулярное выражение, которое будет соответствовать всем маршрутам, которые вы хотите направить в задачу, и использовать регулярное выражение в качестве конечной точки. Это может выглядеть неаккуратно, но это сработает. Я не публикую это как ответ, так как не уверен, каким будет регулярное выражение, и это скорее толчок в этом направлении. Здесь есть упоминание об использовании регулярных выражений в документации: expressjs.com/api.html#app.VERB
Ник Митчинсон,
У меня нет опыта работы с регулярным выражением в JS ... я попробую ... но любой другой вариант приветствуется!
Аронис Мариано
1
У меня тоже мало, поэтому, честно говоря, я не дал его вам, но я понимаю, что регулярные выражения довольно универсальны; Express должен анализировать ваши выражения почти так же, как и любой другой язык.
Ник Митчинсон,
1
Регулярные выражения очень эффективны и определенно заслуживают изучения. Вот решение: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- type ',' text / plain ') .send ("Соответствует:'" + соответствует + "'");}); Пара вещей: 1. Регулярные выражения начинаются и заканчиваются символом /, поэтому любые символы / должны быть экранированы. 2. ^ char соответствует началу строки, $ char соответствует концу строки. Без них матч будет успешным даже с посторонними символами в начале или в конце пути, т.е. / x / blablaxxx
John Deighan

Ответы:

134

Я столкнулся с этим вопросом, ища ту же функциональность.

@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 во всех возможных путях, независимо от того, используются они в текущем запросе или нет.

Таким образом, сложение нескольких путей через массив может быть легко выполнено, но побочные эффекты могут быть непредсказуемыми, если вы надеетесь извлечь что-нибудь полезное из пути, который использовался с помощью параметров или групп захвата. Вероятно, это более полезно для избыточности / псевдонимов, и в этом случае это будет работать очень хорошо.

Изменить: также см. Ответ @ c24w ниже .

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

Кевин Тельер
источник
58
app.get('/:var(bla|blabla)?', todo)

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

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

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

Джонатан Онг
источник
1
/bla(bla)?также работает, но любые параметры после него не заполняются должным образом (т.е. /bla(bla)?/:valueне заполняются req.params.value). Кто-нибудь знает почему?
joscarsson
Если вы используете экспресс, вы можете получить его, req.params.varно вам нужно убедиться, что вы reqперешли к функции
Мэтт Ниндзя,
51

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

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Алекс
источник
28
Какая замена устаревшему?
brandonscript
5
@JonathanOng Вы говорите, что это устарело, а Ремус спрашивает, какая замена. Не могли бы вы ответить на его / ее вопрос?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) отлично работает в экспресс 4 без предупреждения об устаревании
danday74
2
@JonathanOng, просматривающий текущие документы Express v4 с использованием массива, не выглядит устаревшим.
Джейсон Аксельсон
33

Чтобы уточнить ответ Кевина , это из документов 4.x :

Путь, для которого вызывается функция промежуточного программного обеспечения; может быть любым из:

  • Строка, представляющая путь.
  • Шаблон пути.
  • Шаблон регулярного выражения для сопоставления путей.
  • Массив комбинаций любого из вышеперечисленных.

У них есть несколько примеров , в том числе:

Это будет соответствовать пути , начиная с /abcd, /xyza, /lmnи /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
источник
11

Я пошел на:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Огюстен Ридингер
источник
-2

потребовать файл исходного маршрута и определить новый маршрут следующим образом

var user = require('./users');
router.post('/login', user.post('/login'));
Роман Махрер
источник