Ловіть весь маршрут, окрім / для входу


83

Зараз я пишу API, який вимагатиме від користувача передачі маркера автентифікації в заголовку кожного запиту. Тепер я знаю, що можу створити загальний маршрут, скажімо

app.get('/*', function(req,res){

});

але мені було цікаво, як я можу зробити так, щоб він виключав певні маршрути, такі як /loginабо /?


Наприклад, вимагати автентифікації на всіх маршрутах, окрім / login та / register . (Оскільки люди задаються питанням, чому ви задали це питання)
a20

Відповіді:


124

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

app.get('/login', function(req, res) {
  ...
});

app.get('/', function(req, res) {
  ...
});

app.get('*', function(req, res) {
  ...
});

1
Це би працювало лише для "GET" правильно? З якоїсь причини я не можу отримати цю відповідь, з якою можна працювати app.use(включаючи інші методи).
SSH цього

4
@SSHT Це я вважаю, що з останньою версією Express (v4) також app.use('*', ...)має працювати. Але використання app.all('*', ...)переважно в цьому випадку.
robertklep

@JulienMartin щойно протестував, схоже, працює належним чином з Express v4.16.3
robertklep

app.useдодає проміжне програмне забезпечення, яке за задумом переважно передає запит наступному обробнику в ланцюжку (використовуючи додатковий аргумент next).
Stijn de Witt

45

Ви завжди можете розмістити загальний маршрут після тих, які ви хочете виключити (див. Відповідь robertklep ).

Але іноді ви просто не хочете дбати про порядок своїх маршрутів. У цьому випадку ви все ще можете робити те, що хочете:

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});

1
.get ('*', function (req, res, next).
Олівер Діксон,

2
@iLoveUnicorns дякую! Чому ви просто не відредагували мій пост?
Леонід Бесчастний

Якщо інші правила є перед цим, чи потрібно телефонувати наступним?
Сандбург

1
Проміжне програмне забезпечення @Sandburg повинно або зателефонувати next()для передачі виконання наступному проміжному програмному забезпеченню, або надіслати деяку відповідь, щоб закінчити обробку запиту. В іншому випадку запит зависне. Якщо останнє викликане проміжне програмне забезпечення у стеці, next()тоді express надішле відповідь за замовчуванням "404 не знайдено". Замість того, щоб зателефонувати, next()ви можете, наприклад, зателефонувати, res.status(400).end()щоб закінчити обробку запиту, отримавши відповідь "400 Погане повідомлення"
Леонід Бесчастний

24

Якщо ви хочете перевірити облікові дані або автентичність у кожному запиті, вам слід скористатися функцією експрес-маршрутизації "всі", ви можете використовувати її так:

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

Ви можете розмістити його перед будь-яким маршрутом.

Зверніть увагу, що в цьому випадку я використовував "/ api / " як шлях, ви можете використовувати "/ ", якщо це відповідає вашим потребам.

Сподіваюся, ще не пізно допомогти комусь тут.


10

Інший спосіб зробити обробник маршрутів - це:

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

Це працює точно так само, як (прийнята) відповідь Робертклепа, але дає більше інформації про те, що користувач насправді запитував. Тепер у вас є куля, req.params.pageCalledяка представляє будь-яку запитувану сторінку, і ви можете направити користувача на відповідну сторінку, якщо у вас є кілька різних.

Один gotchya, на якого слід стежити (thx @agmin) з цим підходом, /:pageCalledбуде ловити маршрути лише одним /, тому ви не отримаєте /route/1і т. Д. Використовуйте додаткові кулі, як /:pageCalled/:subPageCalledдля більшої кількості сторінок (thx @softcode)


КРАЩЕ? Справді? Вам не здається, що обставини диктують це визначення? ;-) Без зв’язку: Люди голосували проти, не залишаючи коментарів: Як грубо!
Potherca

14
при такому підході є величезне ґотчія, /:pageCalledбуде ловити маршрути лише одним /, отже, ви не отримаєте /route/1тощо
agmin

Крім того, якщо ви не оточите його при спробі / лові, ви отримаєте повідомлення про помилку, якщо ця сторінка не існує.
darethas

@agmin, то чи не буде рішення просто додавати /:pageCalled/:subPageCalledтощо?
софткод
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.