Поймать весь маршрут, ЗА ИСКЛЮЧЕНИЕМ для / login


85

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

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

});

но мне было интересно, как мне сделать так, чтобы он исключал определенные маршруты, такие как /loginили /?


1
Например, требовать аутентификацию на всех маршрутах, кроме / login и / register . (Поскольку люди задаются вопросом, почему вы задали этот вопрос)
— a20

Ответы:


128

Я не уверен, что вы хотите, когда пользователь обращается к /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('*', ...)в этом случае использование предпочтительнее.
— Робертклеп

@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, спасибо! Почему ты просто не отредактировал мой пост?
— Леонид Бесчастный

Если другие правила - До этого, нужно ли звонить дальше?
— Sandburg

1
Промежуточное программное обеспечение @Sandburg должно либо вызывать next()для передачи выполнения следующему промежуточному программному обеспечению, либо отправлять некоторый ответ для завершения обработки запроса. В противном случае запрос зависнет. Если вызвано последнее промежуточное ПО в стеке, next()то express отправит ответ по умолчанию «404 Not Found». Вместо звонка next()вы можете, например, позвонить, res.status(400).end()чтобы завершить обработку запроса с ответом «400 Bad Request».
— Леонид Бесчастный

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

При таком подходе нужно остерегаться (thx @agmin) /:pageCalledтолько для маршрутов /, поэтому вы не получите /route/1и т. Д. Используйте дополнительные ярлыки, например, /:pageCalled/:subPageCalledдля большего количества страниц (thx @softcode)


ЛУЧШЕ? В самом деле? Вам не кажется, что обстоятельства диктуют определение? ;-) Несвязанные: Люди голосуют против, не оставляя комментариев: Как грубо!
— Potherca

15
с этим подходом большая проблема, /:pageCalledловит маршруты только с одиночными /, так что вы не получите /route/1и т. д.
— агмин

Кроме того, если вы не заключите его в команду try / catch, вы получите сообщение об ошибке, если эта страница не существует.
— darethas

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