Я использую настройку маршрутизации, которая использует мою структуру папок '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
Вы используете тело-анализатор? – Josh1billion
Да, другие маршруты могут получить доступ к req.params без проблем. Я добавлю еще одну деталь в конец вопроса. – mz3