删除NodeJS Express中的路由映射

los*_*ace 18 node.js express

我的路线映射为:

app.get('/health/*', function(req, res){
    res.send('1');
});
Run Code Online (Sandbox Code Playgroud)

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

lag*_*lex 26

这将删除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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,它要求中间件/路由功能具有名称:

app.use(function yourMiddlewareFunctionName(req, res, next) {
    ...          ^ named function
});
Run Code Online (Sandbox Code Playgroud)

如果函数是匿名的,它将无法工作:

app.get('/path', function(req, res, next) {
    ...          ^ anonymous function, won't work                    
});
Run Code Online (Sandbox Code Playgroud)

  • 在上面,`route.path`包含路径名 - 如果你想按路径删除匿名路由,你可以改用它. (5认同)

Bra*_*rad 24

Express(至少从3.0.5开始)保留其所有路线app.routes.从文档:

app.routes对象包含由关联的HTTP谓词映射的所有路由.此对象可用于内省功能,例如,Express在内部使用此功能不仅用于路由,还提供默认的OPTIONS行为,除非使用app.options().您的应用程序或框架也可以通过从这个对象中删除它们来删除路由.

app.routes应该看起来像这样:

{ get: 
   [ { path: '/health/*',
       method: 'get',
       callbacks: [Object],
       keys: []}]
}
Run Code Online (Sandbox Code Playgroud)

因此,您应该能够循环app.routes.get直到找到所需内容,然后将其删除.


Bre*_*ung 5

上述方法要求您为路由指定一个命名函数。我也想这样做,但是没有为路由命名的功能,因此我编写了一个npm模块,该模块可以通过指定路由路径来删除路由。

干得好:

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