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


108

Чи є спосіб зробити це за допомогою одного виклику функції?

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

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

Щось на зразок:

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

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

Хтось знає, як це зробити?


2
Ви повинні мати можливість записати регулярний вираз, який буде відповідати всім маршрутам, які ви хочете прокласти до todo, і використовувати регулярний вираз як свою кінцеву точку. Це може виявитися безладним, але це спрацює. Я не публікую це як відповідь, оскільки не впевнений, яким би був регулярний вираз, і це більше підштовхує до цього напрямку. Тут згадується використання регулярних виразів у документах: expressjs.com/api.html#app.VERB
Nick Mitchinson

Я не маю досвіду роботи з регулярним виразом в JS ... погано спробуйте ... але будь-який інший варіант вітається!
Ароніс Маріано

1
У мене теж нема чого, і чесно, чому я не просто дав вам це, однак я розумію, що регулярні вирази є досить універсальними; Експрес повинен розбирати ваші вирази приблизно так само, як і будь-яка інша мова.
Нік Мітчінсон

1
Регулярні вирази дуже потужні і, безумовно, варто вчитися. Ось рішення: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- введіть ',' текст / звичайний ') .send ("Збіг:'" + збіг + "'");}); Пару речей: 1. Регекс починається і закінчується а /, тому будь-які / символи потрібно уникати. 2. ^ char відповідає початку рядка, $ char відповідає кінці рядка. Без них матч матиме успіх навіть із сторонніми ознаками на початку або в кінці шляху, тобто / x / blablaxxx
Джон Дейган

Відповіді:


131

Я натрапив на це питання, шукаючи однакову функціональність.

@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 нижче .

Редагувати 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перейшли до функції
Matt The Ninja

51

Ви насправді можете пройти масив шляхів , як і ви згадали, і він чудово працює:

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

28
Яка заміна цього застарілого?
фірмовий сценарій

5
@JonathanOng Ви говорите, що це застаріле, і Remus запитує, що замінити. Не могли б Ви відповісти на його запитання?
nbro

router.route (['/ mailer / out / system', '/ mailer / out / payment']) працює чудово в експресі 4, без попередження про
депресію

2
@JonathanOng, дивлячись на поточні документи Express v4 за допомогою масиву, не видається застарілим.
Джейсон Аксельсон

32

Просто для того, щоб уточнити відповідь Кевіна , це з документа 4.x :

Шлях, по якому викликається функція проміжного програмного забезпечення; може бути будь-який із:

  • Рядок, що представляє шлях.
  • Траєкторія.
  • Звичайний шаблон виразів, який відповідає шляхам.
  • Масив комбінацій будь-якого з перерахованого вище.

Вони мають кілька прикладів , зокрема:

Це буде відповідати шляху , починаючи з /abcd, /xyza, /lmnі /pqr:

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


-2

вимагати файл вашого вихідного маршруту та визначити новий маршрут таким

var user = require('./users');
router.post('/login', user.post('/login'));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.