我的路线映射为:
app.get('/health/*', function(req, res){
res.send('1');
});
如何在运行时删除/重新映射此路由到空处理程序?
答案 0 :(得分:22)
Express(至少从3.0.5开始)将所有路由保留在app.routes
中。来自documentation:
app.routes对象包含由关联的HTTP谓词映射的所有路由。此对象可用于内省功能,例如,Express在内部使用此功能不仅用于路由,还提供默认的OPTIONS行为,除非使用app.options()。您的应用程序或框架也可以通过从这个对象中删除它们来删除路由。
您的app.routes
应该与此类似:
{ get:
[ { path: '/health/*',
method: 'get',
callbacks: [Object],
keys: []}]
}
因此,您应该能够遍历app.routes.get
,直到找到所需内容,然后将其删除。
答案 1 :(得分:22)
这会删除app.use
个中间件和/或app.VERB
(获取/发布)路由。在express@4.9.5上测试
var routes = app._router.stack;
routes.forEach(removeMiddlewares);
function removeMiddlewares(route, i, routes) {
switch (route.handle.name) {
case 'yourMiddlewareFunctionName':
case 'yourRouteFunctionName':
routes.splice(i, 1);
}
if (route.route)
route.route.stack.forEach(removeMiddlewares);
}
请注意,要求中间件/路由功能具有名称:
app.use(function yourMiddlewareFunctionName(req, res, next) {
... ^ named function
});
如果函数是匿名的,将无效:
app.get('/path', function(req, res, next) {
... ^ anonymous function, won't work
});
答案 2 :(得分:4)
虽然没有API来执行此操作,但可以在服务器运行时删除已安装的处理程序(添加了app.use),因此不建议这样做。
/* Monkey patch express to support removal of routes */
require('express').HTTPServer.prototype.unmount = function (route) {
for (var i = 0, len = this.stack.length; i < len; ++i) {
if (this.stack[i].route == route) {
this.stack.splice(i, 1);
return true;
};
}
return false;
}
这是我需要的东西,所以很遗憾没有合适的api,但是express只是模仿连接在这里做什么。
答案 3 :(得分:4)
app.get$ = function(route, callback){
var k, new_map;
// delete unwanted routes
for (k in app._router.map.get) {
if (app._router.map.get[k].path + "" === route + "") {
delete app._router.map.get[k];
}
}
// remove undefined elements
new_map = [];
for (k in app._router.map.get) {
if (typeof app._router.map.get[k] !== 'undefined') {
new_map.push(app._router.map.get[k]);
}
}
app._router.map.get = new_map;
// register route
app.get(route, callback);
};
app.get$(/awesome/, fn1);
app.get$(/awesome/, fn2);
然后当你转到http://...awesome
fn2
时,将会被称为:)
修改:修复代码
Edit2:再次修复......
Edit3:也许更简单的解决方案是在某个时刻清除路线并重新填充它们:
// remove routes
delete app._router.map.get;
app._router.map.get = [];
// repopulate
app.get(/path/, function(req,res)
{
...
});
答案 4 :(得分:3)
上述方法要求您具有该路线的命名功能。我也想这样做,但没有为路由命名函数,所以我编写了一个npm模块,可以通过指定路由路径来删除路由。
你走了:
答案 5 :(得分:2)
您可以查看Express route middleware并可能进行重定向。