2015-12-16 2 views
2

Все:Почему app.param не работать, если я указать router.param Экспресс

Я довольно новыми для Express.js, когда я попытался .param(), одна интересная вещь:

в app.js (основной файл-сервер), у меня есть что-то вроде:

app.param("id", function(req, res, next, id){ 
    console.log(id+" in app level"); 
    next(); 
}) 
app.use("/", routes); 

Приложение является объектом Экспресс приложений, и в маршрутах модуль маршрутизатора:

router.param("id", function(req, res, next, id){ 
    console.log(id + " in router level"); 
    next(); 
}) 

router.get('/:id', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

Но когда я запрашиваю/testUserId, запускается только param() внутри модуля маршрутизатора, я думал, что app.param() будет запускаться сначала, а затем router.param(), но на самом деле это не так, может кто-нибудь объяснить, почему (I должен пропустить некоторые части документа API из Express) и как сделать оба запуска?

Спасибо

ответ

3

Согласен, что это несколько сбивает с толку. Был разговор об этом, и вопрос был раскрыт, чтобы прояснить это поведение в документации (Explain that .param doesn't get inherited in mounted routers.).

Вот последнее объяснение: app.param([name], callback)

функции обратного вызова Param являются локальными для маршрутизатора, на котором они определены. Они не наследуются установленными приложениями или маршрутизаторами. Следовательно, param callbacks, определенные в приложении, будут запускаться только по параметрам маршрута , определенным на маршрутах приложения.

Чтобы повторить, ожидается поведение, которое вы видите. Вложенные «маршрутизаторы» или «приложения» не наследуют .param() от родительского приложения.

+0

Спасибо, я прочитаю это и попробую еще раз. – Kuan