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.