2012-04-30 31 views

Trả lời

20

Điều này sẽ xóa app.use phần giữa và/hoặc app.VERB (nhận/đăng) tuyến đường. Thử nghiệm trên [email protected]

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); 
} 

Lưu ý rằng nó đòi hỏi rằng các chức năng trung gian/route đều tên:

app.use(function yourMiddlewareFunctionName(req, res, next) { 
    ...  ^named function 
}); 

sẽ không làm việc nếu chức năng là vô danh :

app.get('/path', function(req, res, next) { 
    ...  ^anonymous function, won't work      
}); 
+4

Trong phần trên, 'route.path' chứa tên đường dẫn - nếu bạn muốn xóa một tuyến đường ẩn danh bằng đường dẫn, bạn có thể bật tuyến đường đó thay thế. – Jesse

2

Bạn có thể xem trong Express route middleware và có thể thực hiện chuyển hướng.

+0

Tôi không có vẻ để có thể sửa đổi các tuyến đường hiện có ở tất cả khi họ đang thành lập. Điều này bao gồm thêm phần mềm trung gian mới. Mặc dù bây giờ tôi sẽ sử dụng lệnh tiếp theo ('route') – lostinplace

3

Có thể xóa trình xử lý được gắn (được thêm bằng app.use) trong khi máy chủ đang chạy, mặc dù không có API để thực hiện việc này, vì vậy không nên sử dụng.

/* 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; 
} 

Đây là điều tôi cần, vì vậy thật đáng tiếc là không có api phù hợp, nhưng thể hiện chỉ là bắt chước kết nối ở đây.

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); 

Và sau đó khi bạn đi đến http://...awesomefn2 sẽ được gọi :)

Edit: cố định mã

Edit2: cố định một lần nữa ...

Edit3: giải pháp Có lẽ đơn giản là để thanh lọc các tuyến đường tại một số thời điểm và phục hồi lại chúng:

// remove routes 
delete app._router.map.get; 
app._router.map.get = []; 

// repopulate 
app.get(/path/, function(req,res) 
{ 
    ... 
}); 
20

Express (ít nhất là 3.0.5) giữ tất cả các tuyến đường của nó trong app.routes. Từ số documentation:

Đối tượng app.routes chứa tất cả các tuyến được xác định ánh xạ bởi động từ HTTP được liên kết. Đối tượng này có thể được sử dụng cho khả năng introspection, ví dụ như Express sử dụng nội bộ này không chỉ để định tuyến mà còn cung cấp hành vi OPTIONS mặc định trừ khi app.options() được sử dụng. Ứng dụng hoặc khung công tác của bạn cũng có thể xóa các tuyến đường bằng cách xóa chúng khỏi đối tượng này.

bạn app.routes sẽ trông giống như thế này:

{ get: 
    [ { path: '/health/*', 
     method: 'get', 
     callbacks: [Object], 
     keys: []}] 
} 

Vì vậy, bạn sẽ có thể lặp qua app.routes.get cho đến khi bạn tìm thấy những gì bạn đang tìm kiếm, và sau đó xóa nó.

+1

Đây là badass cool. công việc tốt – lostinplace

+0

Điều này cực kỳ hữu ích. Tuy nhiên, khi tôi tiếp tục thử nó, tôi tiếp tục chạy vào những vấn đề thực sự kỳ lạ. Có cách nào ở tất cả các bạn có thể viết ra một ví dụ đơn giản? – streetlight

+0

Đặc biệt, nó cũng xóa tất cả ánh xạ tài nguyên tĩnh của tôi - bạn có biết tại sao đây không? Đây là câu hỏi của tôi cho nó có chi tiết hơn ... http://stackoverflow.com/questions/15487084/removing-a-specfic-mapped-route-in-node-js-at-runtime-removes-static-mapping – streetlight

0

Như đã đề cập ở trên, API Express mới dường như không hỗ trợ điều này.

  1. Có thực sự cần thiết phải loại bỏ hoàn toàn bản đồ không? Nếu tất cả những gì bạn cần là ngừng phân phối một tuyến đường, bạn có thể dễ dàng bắt đầu trả lại một số lỗi từ trình xử lý.

    Trường hợp duy nhất (rất kỳ lạ), điều này sẽ không đủ tốt là nếu các tuyến động được thêm vào mọi lúc và bạn muốn loại bỏ hoàn toàn các ... Đọc thêm

  2. Nếu bạn muốn remap nó (hoặc làm điều gì đó khác, hoặc lập bản đồ nó đến một cái gì đó luôn luôn trả về một lỗi), bạn luôn có thể thêm một mức gián tiếp:

    var healthHandler = function(req, res, next) { 
        // do something 
    }; 
    
    app.get('/health/*', function(req, res, next) { 
        healthHandler(req, res, next); 
    }); 
    
    // later somewhere: 
    
    healthHandler = function(req, res, next) { 
        // do something else 
    }; 
    

    Theo tôi đây là đẹp hơn/an toàn hơn so với thao tác một số nội bộ không có giấy tờ trong Express.

+0

Trường hợp sử dụng của tôi cho phép người dùng định cấu hình các tuyến đường trong CMS (ứng dụng giao diện người dùng dựa trên trình duyệt). Ngoài ra, tôi muốn phạm vi các tuyến đường dựa trên thông tin tiêu đề như trường 'Máy chủ'. Tôi có thể sẽ chỉ định tuyến tất cả các yêu cầu đến cùng một trình xử lý và sau đó thực hiện định tuyến tùy chỉnh của riêng tôi bên ngoài API định tuyến nhanh. –

3

Phương pháp trên yêu cầu bạn có chức năng được đặt tên cho tuyến đường. Tôi muốn làm điều này là tốt nhưng không có chức năng được đặt tên cho các tuyến đường vì vậy tôi đã viết một mô-đun npm có thể loại bỏ các tuyến đường bằng cách xác định đường dẫn định tuyến.

Ở đây bạn đi:

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

Các vấn đề liên quan