2013-10-11 14 views
38

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

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

}); 

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

+0

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

ответ

62

Я не уверен, что вы хотите, когда пользователь обращается к /login или /, но вы можете создать для них отдельные маршруты; если вы объявите их перед догоняющего все, они получают первые бабки при обработке входящих запросов:

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

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

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

Это будет работать только для «GET»? По какой-то причине я не могу получить этот ответ для работы с 'app.use' (чтобы включить другие методы). –

+2

@SSHThis Я думаю, что с самой последней версией Express (v4) '' app.use ('*', ...) 'должен работать. Но использование ['app.all ('*', ...)'] (http://expressjs.com/en/4x/api.html#app.all) является предпочтительным в этом случае. – robertklep

26

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

Но иногда вы просто не хотите заботиться о порядке ваших маршрутов. В этом случае вы можете сделать то, что вы хотите:

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

.get ('*', function (req, res, next). –

+1

@iLoveUnicorns thanx! Почему вы просто не отредактировали мой пост? –

8

Другим способом сделать всеохватывающий обработчик маршрута заключается в следующем:

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 
}); 

Это работает точно так же, как (принято) ответ robertklep, но это дает вам больше информации о том, что пользователь запросил. Теперь у вас есть slug req.params.pageCalled для представления любой запрашиваемой страницы и может направить пользователя на соответствующую страницу, если у вас несколько разных.

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

+0

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

+13

есть огромный getchya с этим подходом, '/: pageCalled' будет только ловить маршруты с помощью одного'/', поэтому вы не получите'/route/1' и т. Д. – agmin

+0

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

14

Если вы хотите проверить подлинность учетных данных или в каждом запросе следует использовать функцию маршрутизации Экспресс «все», вы можете использовать его как это:

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

вы можете поместить его перед любой Routing вещи.

Обратите внимание, что в этом случае я использовал «/ api/» в качестве пути, вы можете использовать «/», который вам подходит.

Надеюсь, что еще не поздно помочь кому-то здесь.

Смежные вопросы