2016-05-22 2 views
1

Я пытаюсь создать механизм проверки подлинности для своего приложения, проверив файлы cookie. Поэтому я добавил router.all('*'), чтобы соответствовать каждому запросу, проверить файл cookie и перейти к фактическому обработчику. Но мне нужно, чтобы он соответствовал запросам, у которых один или несколько символов после '/'. (Я хочу соответствовать /manage, /m или /about, но не /).Сопоставьте все маршруты, но '/' в Express

//Assuming a request for '/', this gets called first 
router.all('*', function (request, response, next) { 
    //Stuff happening 
    next(); 
}); 

//This gets called on next(), which I do not want 
router.get('/', function (request, response) { 
    //Stuff happening 
}); 

//However this I do want to be matched when requested and therefore called after router.all() 
router.post('/about', function (request, response) { 
    //Stuff happening 
}); 

Согласно ответам here вы можете использовать регулярные выражения для сопоставления пути, но тогда я не понимаю, что '*' есть. Он может соответствовать всем, но для меня это не похоже на регулярное выражение.

  1. Почему '*' соответствует /?
  2. Какой аргумент мне нужно для suplly до all() в соответствии с /about, но не /?

ответ

2

Проще говоря * последний. Маршрутизатор проверяет порядок определения.

Итак:

router.get('/' ... 

затем

router.all('*' ... 

Только помните, что / остается в силе для *, поэтому next() вызов от / вызовет Загвоздка весь процесс.

+1

Иногда решение вашей проблемы не является ответом на ваш вопрос, а является решением проблемы. –

1

Путь, состоящий только из символа звезды ('*'), означает «соответствовать чему-либо», который включает только имя хоста самостоятельно.

Для того, чтобы «только что совместить», используйте группу точек с помощью оператора «плюс», что означает «соответствовать чему-либо хотя бы раз».

router.all(/\/^.+$/,() => { 
    // ... 
})