同一路由器上的多个.use()导致覆盖回调

时间:2015-08-03 22:02:25

标签: javascript node.js express

我使用名为consign的模块一次在目录中包含多个不同的模块(而不是拥有一堆require语句)。在这些模块中,我一直在为路由器文件顶部的每个端点设置安装路径,以免在整个文件中重复多次。但是,consign将相同的路由器传递给其中的每一个(通常应该没问题),如果任何文件中的路径相同,则通过use()方法实际覆盖安装路径。我会尝试以最好的方式展示这一点......

/routes/api.js

var express = require('express');
var router = express.Router();
var consign = require('consign');

// get all routes inside the api directory and attach them to the api router
// all of these routes should be behind authorization
consign({
  cwd: 'routes'
})
  .include('api')
  .into(router);

module.exports = router;

/routes/api/player.js

module.exports = function (router) {
  router.use('/player', router);

  router.get('/getInfo', function (req, res, next) {
    res.error = false;
    res.data = {};
    res.message = "Player getInfo API Call - IN DEVELOPMENT";
    next();
  });
};

/routes/api/profile.js

module.exports = function (router) {
  router.use('/profile', router);

  router.get('/getInfo', function (req, res, next) {
    res.error = false;
    res.data = {};
    res.message = "Profile getInfo API Call - IN DEVELOPMENT";
    next();
  });
}

Consign正在加载模块就好了,但是当路径相同时,router.use()方法似乎会覆盖回调(忽略基本路径)。例如," / player / getInfo"和" / profile / getInfo"作为一个电话工作,但都回应" / profile / getInfo"数据

顺便说一句 - 如果您想知道并且如果它是相关的,我有一小部分中间件称为" formatResponse"这将以相同的方式获取数据并格式化所有调用,这就是为什么我有一个" next()"而是从功能本身响应。该代码也在下面。

/middleware/formateResponse.js

module.exports = function(req, res, next) {
  res.json({
    error: res.error,
    data: res.data,
    message: res.message
  });
}

1 个答案:

答案 0 :(得分:0)

你现在的方式,没有范围。您将路由器安装在' / profile'然后在' / getInfo'中添加了一个get语句。路径并没有像你想象的那样改变范围。他们都存储以匹配' / getInfo',最后一个获胜(无论前缀如何。我打赌导航到http://your-server/getInfo也会有效)。

您需要为每个模块使用不同的路由器(然后将其安装在所需的路径根目录上),或者在其余路由中更明确(例如,呼叫router.get('/profile/getInfo', ...)