express.js - trình xử lý định tuyến đơn cho nhiều tuyến trong một dòng


107

Có cách nào để thực hiện điều này trên một lệnh gọi hàm duy nhất không?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Cái gì đó như:

app.get("/", "/blabla", "/blablablabla", todo );

Tôi biết đây là một mớ hỗn độn về cú pháp, nhưng chỉ để đưa ra ý tưởng về những gì tôi muốn đạt được, một mảng các tuyến sẽ thật tuyệt vời!

Bất cứ ai biết làm thế nào để làm điều này?


2
Bạn sẽ có thể viết một biểu thức chính quy sẽ khớp với tất cả các tuyến đường bạn muốn định tuyến để thực hiện và sử dụng biểu thức chính quy làm điểm cuối của bạn. Nó có thể trông lộn xộn, nhưng nó sẽ hoạt động. Tôi không đăng câu trả lời này như một câu trả lời vì tôi không chắc biểu thức chính quy sẽ là gì và đây là động lực thúc đẩy hơn nữa. Có đề cập của việc sử dụng biểu thức thông thường trong các tài liệu ở đây: expressjs.com/api.html#app.VERB
Nick Mitchinson

tôi không có kinh nghiệm với regex trong JS ... tôi không thử ... nhưng bất kỳ tùy chọn nào khác đều được hoan nghênh!
Aronis Mariano

1
Tôi cũng không có nhiều, thành thật mà nói, đó là lý do tại sao tôi không đưa nó cho bạn, tuy nhiên sự hiểu biết của tôi là biểu thức chính quy khá phổ biến; Express nên phân tích cú pháp các biểu thức của bạn khá giống với bất kỳ ngôn ngữ nào khác.
Nick Mitchinson

1
Biểu thức chính quy rất mạnh mẽ và chắc chắn đáng học hỏi. Đây là một giải pháp: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var match = req.params [0]; resp .set ('Content- type ',' text / trơn ') .send ("Đã khớp:'" + đã khớp + "'");}); Một vài điều: 1. regex bắt đầu và kết thúc bằng dấu /, vì vậy bất kỳ ký tự / nào phải được thoát ra. 2. Ký tự ^ khớp với phần đầu của chuỗi, $ char khớp với phần cuối của chuỗi. Nếu không có họ, trận đấu sẽ thành công ngay cả với ký tự không liên quan vào đầu hoặc cuối của con đường, tức là / x / blablaxxx
John Deighan

Câu trả lời:


130

Tôi đã gặp câu hỏi này khi đang tìm kiếm chức năng tương tự.

@Jonathan Ong đã đề cập trong một nhận xét ở trên rằng việc sử dụng mảng cho đường dẫn không được dùng nữa nhưng nó được mô tả rõ ràng trong Express 4 và nó hoạt động trong Express 3.x. Đây là một ví dụ về một cái gì đó để thử:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

Từ bên trong requestđối tượng, với đường dẫn /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Lưu ý những gì xảy ra với các tham số: Nó biết các nhóm nắm bắt và tham số trong tất cả các đường có thể có, cho dù chúng có được sử dụng trong yêu cầu hiện tại hay không.

Vì vậy, việc xếp chồng nhiều đường dẫn thông qua một mảng có thể được thực hiện dễ dàng, nhưng các tác dụng phụ có thể không thể đoán trước được nếu bạn hy vọng nhận được bất kỳ thứ gì hữu ích từ đường dẫn được sử dụng theo cách tham số hoặc nhóm bắt. Nó có lẽ hữu ích hơn cho dự phòng / răng cưa, trong trường hợp đó, nó sẽ hoạt động rất tốt.

Chỉnh sửa: Vui lòng xem thêm câu trả lời của @ c24w bên dưới .

Chỉnh sửa 2: Đây là một câu trả lời phổ biến vừa phải. Hãy nhớ rằng ExpressJS, cũng như hầu hết các thư viện Node.js, là một bữa tiệc linh hoạt. Mặc dù định tuyến ở trên vẫn hoạt động (tôi đang sử dụng nó vào lúc này, một tính năng rất tiện dụng), tôi không thể đảm bảo cho đầu ra của đối tượng yêu cầu (nó chắc chắn khác với những gì tôi đã mô tả). Vui lòng kiểm tra cẩn thận để đảm bảo bạn nhận được kết quả mong muốn.


Hoạt động như một sự quyến rũ. Cảm ơn.
OrAssayag

58
app.get('/:var(bla|blabla)?', todo)

:varthiết lập req.parammà bạn không sử dụng. nó chỉ được sử dụng trong trường hợp này để đặt regex.

(bla|blabla)đặt regex để khớp, vì vậy nó khớp với các chuỗi blablablah.

?làm cho toàn bộ regex là tùy chọn, vì vậy nó cũng phù hợp /.


1
/bla(bla)?cũng hoạt động, nhưng bất kỳ tham số nào sau đó không điền đúng cách (tức là /bla(bla)?/:valuekhông điền req.params.value). Có ai biết tại sao không?
joscarsson

Nếu bạn sử dụng thể hiện bạn có thể lấy nó với req.params.varnhưng bạn cần phải chắc chắn rằng bạn đã reqtruyền cho hàm
Matt Các Ninja

51

Bạn thực sự có thể vượt qua một loạt các đường dẫn , giống như bạn đã đề cập và nó hoạt động rất tốt:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
Cái gì thay thế cho cái này không dùng nữa?
brandonscript

5
@JonathanOng Bạn nói rằng cái này không được dùng nữa và remus đang hỏi cái gì thay thế. Bạn có thể vui lòng trả lời câu hỏi của anh ấy / cô ấy không?
nbro

router.route ([ '/ bưu phẩm ra / vào / hệ thống', '/ bưu phẩm ra / vào / thanh toán']) đang làm việc tốt trong hiện 4 không có cảnh báo deprecation
danday74

2
@JonathanOng xem tài liệu Express v4 hiện tại bằng cách sử dụng một mảng có vẻ như không được chấp nhận.
Jason Axelson

32

Chỉ để giải thích thêm về câu trả lời của Kevin , đây là từ tài liệu 4.x :

Đường dẫn mà chức năng phần mềm trung gian được gọi; có thể là bất kỳ trong số:

  • Một chuỗi đại diện cho một đường dẫn.
  • Một mẫu đường dẫn.
  • Một mẫu biểu thức chính quy để khớp với các đường dẫn.
  • Một mảng kết hợp của bất kỳ điều nào ở trên.

Họ có một số ví dụ , bao gồm:

Điều này sẽ phù hợp với những con đường bắt đầu với /abcd, /xyza, /lmn, và /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});

11

Tôi đã đi cho một:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});

-2

yêu cầu tệp của tuyến đường ban đầu của bạn và xác định tuyến đường mới như thế này

var user = require('./users');
router.post('/login', user.post('/login'));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.