Поймать все маршруты, кроме /login


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

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

});

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

4   51  

4 ответа:

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

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

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

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

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

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

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

Если вы хотите проверить учетные данные или подлинность в каждом запросе, вы должны использовать функцию экспресс-маршрутизации "все", вы можете использовать ее следующим образом:

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

вы можете разместить его перед любым материалом маршрутизации.

обратите внимание, что в этом случае я использовал " / api/ " как путь, вы можете использовать "/" ты это соответствует вашим потребностям.

надеюсь, это не слишком поздно, чтобы помочь кому-то здесь.

еще один способ сделать обработчик маршрута catch-all это:

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 (принято) ответ, но это дает вам больше информации о том, что пользователь на самом деле просил. Теперь у вас есть слизняк req.params.pageCalled представлять, что страница запрашивается и может направить пользователя на соответствующую страницу, если у вас есть несколько разных.

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