防止express.js中的重复路由

时间:2014-08-05 20:17:02

标签: express

有没有一种很好的方法可以防止重复路由在快递中注册?我有一个非常大的应用程序,有不同文件的数百条路由,当我去添加新路径时,我很难知道我是否已经注册了某条路线。例如,当express到达routes487.js时,我想抛出一个错误:

档案:routes1.js

var ctrl = require('../controllers/testctrl');
var auth = require('../libs/authentication');

module.exports = function (app) {
    app.get('/hi', auth.getToken, ctrl.hi);
    app.get('/there', auth.getToken, ctrl.there);
};

档案:routes487.js

var ctrl = require('../controllers/testctrl487');
var auth = require('../libs/authentication');

module.exports = function (app) {
    app.get('/hi', auth.getToken, ctrl.hi487);
};

1 个答案:

答案 0 :(得分:0)

您可以通过使用验证包装express方法来尝试自定义解决方案。请考虑对您的快速应用进行以下修改:

// route-validation.js
module.exports = function (app) {
  var existingRoutes = {}
    , originalMethods = [];

  // Returns true if the route is already registered.
  function routeExists(verb, path) {
    return existingRoutes[verb] &&
      existingRoutes[verb].indexOf(path) > -1;
  }

  function registerRoute(verb, path) {
    if (!existingRoutes[verb]) existingRoutes[verb] = [];
    existingRoutes[verb].push(path);
  }

  // Return a new app method that will check repeated routes.
  function validatedMethod(verb) {
    return function() {
      // If the route exists, app.VERB will throw.
      if (routeExists(verb, arguments[0]) {
        throw new Error("Can't register duplicate handler for path", arguments[0]);
      }
      // Otherwise, the route is saved and the original express method is called.
      registerRoute(verb, arguments[0]);
      originalMethods[verb].apply(app, arguments);
    }
  }

  ['get', 'post', 'put', 'delete', 'all'].forEach(function (verb) {
    // Save original methods for internal use.
    originalMethods[verb] = app[verb];
    // Replace by our own route-validator methods.
    app[verb] = validatedMethod(verb);
  });
};

您只需要在创建后将您的应用程序传递给此函数,并且将实施重复的路径检查。请注意,您可能需要其他“动词”(OPTIONSHEAD)。

如果您不想使用快速'方法(我们不知道是否或如何表达自己或中间件模块将使用它们),您可以使用中间层(即,您实际上包装您的应用程序对象修改其方法)。我实际上觉得这将是一个更好的解决方案,但我现在懒得输入它:)