【发布时间】:2015-03-17 23:23:23
【问题描述】:
我使用了一个路由设置,它使用我的“api”文件夹的目录结构来直观地设置路由。但是,在我使用文件夹名称表示路由参数的情况下,req.params 在控制器中是未定义的。
有问题的路线是:
GET /api/google/accounts/:account_id/analytics/profiles/
这是我的路由加载器。它基本上在 api 文件夹上执行 glob 查找名为 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
./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 with Express.js nested router
但是,按照建议设置子路由器也无济于事。
var router = require("express").Router({mergeParams: true});
// no difference
【问题讨论】:
-
你在使用body-parser吗?
-
可以,其他路由都可以访问req.params没问题。我将在问题的末尾添加更多细节。
标签: javascript node.js express