有没有一种很好的方法可以防止重复路由在快递中注册?我有一个非常大的应用程序,有不同文件的数百条路由,当我去添加新路径时,我很难知道我是否已经注册了某条路线。例如,当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);
};
答案 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);
});
};
您只需要在创建后将您的应用程序传递给此函数,并且将实施重复的路径检查。请注意,您可能需要其他“动词”(OPTIONS
,HEAD
)。
如果您不想使用快速'方法(我们不知道是否或如何表达自己或中间件模块将使用它们),您可以使用中间层(即,您实际上包装您的应用程序对象修改其方法)。我实际上觉得这将是一个更好的解决方案,但我现在懒得输入它:)