Поймать весь маршрут, ЗА ИСКЛЮЧЕНИЕМ для / 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.