【问题标题】:ExpressJS req.params empty in nested routersExpressJS req.params 在嵌套路由器中为空
【发布时间】: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


【解决方案1】:

原来是mergeParams was not added to Express until 4.5.0;我的项目仍在 4.2.0 上。更新到 4.5.0 并将{mergeParams: true} 传递给子路由器解决了这个问题。有关详细信息,请参阅此类似问题:

Rest with Express.js nested router

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2019-07-07
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多