删除NodeJS Express中的路由映射

时间:2012-04-30 04:58:45

标签: node.js express

我的路线映射为:

app.get('/health/*', function(req, res){
    res.send('1');
});

如何在运行时删除/重新映射此路由到空处理程序?

6 个答案:

答案 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模块,可以通过指定路由路径来删除路由。

你走了:

https://www.npmjs.com/package/express-remove-route

答案 5 :(得分:2)

您可以查看Express route middleware并可能进行重定向。