2015-07-26 1 views
-1

Say есть 2 router.route(), например:Как Express знает, какой путь маршрутизатора использовать при использовании нескольких путей?

router.route('/app/:id').get(funtion(req, res, next){ 
    console.log("id route") 
}); 

и

router.route('/app/:username').get(funtion(req, res, next){ 
    console.log("user route") 
}); 

Когда GET /app/nsuzuki называется, который router.route() не использует и почему?

+0

первый маршрут ... – Alon

+0

почему первый маршрут? – NathanSuzuki

+0

маршруты в экспресс-работе с первого матча, в зависимости от заказа, в который они загружены. – oznu

ответ

3

Чтобы полностью понять это, пожалуйста, прочитайте документацию: http://expressjs.com/api.html#router.METHOD

Как Экспресс Маршруты Capture Дорожки

При использовании :param как часть вашего пути, он соответствует всем, как /* и захваченное значение хранится в req.params.param.

Если у вас есть несколько правил, первая зарегистрированная первая проверяется. Он проверяет каждый вызов против каждого правила до тех пор, пока не будет найдено совпадение. Если вы вызываете next() без каких-либо значений, переданных ему, он будет искать следующее совпадение (либо в том же маршруте, либо перейти к следующему промежуточному программному обеспечению).

Таким образом, эти три правила будут все работать

var handleRoute = function(req, res, next){ 
    console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]); 
    next(); 
} 

route.route('/user/:id').get(handleRoute); 
route.route('/user/:user').get(handleRoute); 
route.route('/user/*').get(handleRoute); 

Когда я прошу /user/foobar, я буду видеть следующий вывод (и, возможно, ошибка в качестве клиента, потому что я никогда не ответил: P)

/user/foobar foobar undefined undefined 
/user/foobar undefined foobar undefined 
/user/foobar undefined undefined foobar 

Это ударит по всем трем, но контекст для каждого другого.

Как захватить шаблоны путей с использованием регулярных выражений

Если вы хотите, чтобы захватить отдельные маршруты для ид (скажем, все номера) и имя пользователя (все буквы), вы можете сделать это:

var handleRoute = function(tag) { 
    return function(req, res, next) { 
    console.log(tag + ' ' + req.path + ' -> ' + req.params[0]); 
    res.status(200) 
     .json({ 
     success: 'yay!' 
     }); 
    }; 
}; 

route.route(/^\/user\/([0-9]+)$/i) 
    .get(handleRoute('id')); 
route.route(/^\user\/([A-Za-z]+)$/i) 
    .get(handleRoute('user')); 
route.route('/user/*') 
    .get(handleRoute('catch all')); 

Обратите внимание на паратезис вокруг моей группы захвата. Без этого params пуст. Он автоматически захватывает только * в строке, потому что они хорошие люди. Я получаю следующее для вывода, когда я запускаю три разных типа.

id /user/123 -> 123 
user /user/user -> user 
catch all /user/user.1 -> user.1 

Все, что объяснялось, вы открываете для себя какие-то векторы ошибок, которые наводняют вашу систему. Можете подумать о шаблоне URL.

+0

благодарит за отличную помощь Крис :) Я очень ценю это – NathanSuzuki

+0

Нет проблем. Экспресс имеет множество функций, которые могут быть изначально запутаны, но на самом деле это просто вопрос деконструкции работы трубопровода. Всегда весело выполнять все примеры из документов, если вы хотите узнать, как работают входы и выходы. –