2015-03-17 2 views
4

Я использую настройку маршрутизации, которая использует мою структуру папок 'api' для интуитивной настройки маршрутов. Однако в случаях, когда я использую имя папки для представления параметра маршрута, req.params не определено в контроллере.ExpressJS req.params пуст в вложенных маршрутизаторах

Маршрут с проблемой является:

GET /api/google/accounts/:account_id/analytics/profiles/ 

Вот мой маршрут погрузчик. Он в основном делает глобус в папке api, ища файлы с именем routes.js и делает app.use на соответствующем маршруте (определяется по структуре папок).

// load routers 
    files = glob.sync("api/**/routes.js"); 

    console.log(files); 
    // [ 'api/campaigns/routes.js', 
    // 'api/google/accounts/:account_id/analytics/profiles/routes.js', 
    // 'api/google/accounts/routes.js', 
    // 'api/google/urls/routes.js', 
    // 'api/users/routes.js' ] 

    // use each router on the appropriate route 
    for(var i=0;i<files.length;i++) { 

    route = "/" + files[i].split("/routes.js")[0]; 

    console.log(route); 
    // '/api/google/accounts/:account_id/analytics/profiles' 

    router = require(path.join(__dirname, files[i]))(config); 
    routes = router.stack; 
    app.use(route, router); 

    // list all registered routes for this router 
    for(var j=0;j<routes.length;j++) { 
     routeDebug(("  " + Object.keys(routes[j].route.methods)[0].toUpperCase()).slice(-6) + " " + route + routes[j].route.path); 
    } 
    } 

Структура папки «апи» является:

./api 
./api/campaigns 
./api/campaigns/controller.js 
./api/campaigns/model.js 
./api/campaigns/routes.js 
./api/users 
./api/users/controller.js 
./api/users/model.js 
./api/users/routes.js 
./api/google 
./api/google/accounts 
./api/google/accounts/:account_id 
./api/google/accounts/:account_id/analytics 
./api/google/accounts/:account_id/analytics/profiles 
./api/google/accounts/:account_id/analytics/profiles/controller.js 
./api/google/accounts/:account_id/analytics/profiles/routes.js 
./api/google/accounts/controller.js 
./api/google/accounts/model.js 
./api/google/accounts/routes.js 
./api/google/urls 
./api/google/urls/controller.js 
./api/google/urls/routes.js 

В приведенном выше цикле routeDebug является оберткой вокруг пакета отладки НПМ. Выход:

routes GET /api/campaigns/ +0ms 
    routes POST /api/campaigns/ +2ms 
    routes GET /api/campaigns/:campaign_id +1ms 
    routes PUT /api/campaigns/:campaign_id +0ms 
    routes DELETE /api/campaigns/:campaign_id +0ms 
    routes GET /api/google/accounts/:account_id/analytics/profiles/ +128ms 
    routes GET /api/google/accounts/ +4ms 
    routes POST /api/google/accounts/ +0ms 
    routes POST /api/google/urls/ +3ms 
    routes GET /api/users/ +12ms 
    routes POST /api/users/ +0ms 
    routes GET /api/users/:user_id +0ms 
    routes PUT /api/users/:user_id +0ms 
    routes DELETE /api/users/:user_id +0ms 

Таким образом, мы можем видеть, что маршрут, о котором идет речь, настроен так, как ожидалось. Но req.params не определено. Другие пути не имеют этой проблемы.

Почему req.params пуст только для данного маршрута? Есть ли лучший способ для создания этих вложенных маршрутов, чем использование папки в качестве параметра маршрута?

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

Rest with Express.js nested router

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

var router = require("express").Router({mergeParams: true}); 
// no difference 
+0

Вы используете тело-анализатор? – Josh1billion

+0

Да, другие маршруты могут получить доступ к req.params без проблем. Я добавлю еще одну деталь в конец вопроса. – mz3

ответ

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