ExpressJS req.params在嵌套路由器中为空

我使用路由设置,使用我的'api'文件夹的目录结构直观地设置路线。 但是,在我使用文件夹名称来表示路由参数的情况下,控制器中的req.params未定义。

有问题的路线是:

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

这是我的路由加载器。 它基本上在api文件夹上查找名为routes.js文件,并在适当的path(从文件夹结构确定)上执行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 ./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是debug npm包裹的一个包装。 输出是:

  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只能为这个特定的路线空? 有没有比使用文件夹作为路由参数获得这些嵌套路线更好的方法?

编辑:我期望这个问题来自巢式路由器不能访问父路由器的参数。

rest与Express.js嵌套路由器

但是,按照build议设置子路由器也无济于事。

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

事实certificate, mergeParams直到4.5.0才被添加到Express ; 我的项目还在4.2.0上。 更新到4.5.0并将{mergeParams: true}传递给子路由器解决了这个问题。 看到这个类似的问题了解更多详情:

rest与Express.js嵌套路由器