2013-07-18 38 views
18

Nói rằng tôi đã có một vài tuyến đường GET trên ứng dụng Express:Đặt tên và đặt hàng tuyến đường Node.js Express: ưu tiên được xác định như thế nào?

// music albums 
app.get('/api/albums', routes.albums.getAlbums); 
app.get('/api/albums/:id', routes.albums.getAlbum); 
app.get('/api/albums/artwork', routes.albums.getAlbumArtwork); 

và tôi cố gắng để đánh họ bằng cách sử dụng theo đoạn jQuery AJAX:

$("#retrieveAlbumArtwork").on("click", function() { 
    $.ajax({ 
     url: "api/albums/artwork", 
     type: "GET", 
     data: { 
      artist: $("#albumArtist").val(), 
      title: $("#albumTitle").val() 
     }, 
     // ... callbacks and such 

Đối với một số lý do, cuộc gọi này hit trình xử lý thứ hai, với thông số /:id, thay vì đường dẫn rõ ràng /artwork. Trao đổi chúng giống như vậy khiến chúng hoạt động như mong đợi:

// music albums 
app.get('/api/albums', routes.albums.getAlbums); 
app.get('/api/albums/artwork', routes.albums.getAlbumArtwork); 
app.get('/api/albums/:id', routes.albums.getAlbum); 

Ai đó có thể giải thích chính xác tại sao điều này xảy ra? Tôi sẽ giả sử Express sẽ đủ thông minh để xác định một tham số id (/albums/23453243) so với một chuỗi truy vấn (/albums/artwork?artist=artistName&title=albumTitle) và tuyến đường phù hợp, nhưng điều này dường như không phải là trường hợp?

Trả lời

18

Không. :id sẽ khớp với mọi thứ. Vì vậy, /api/albums/artwork là hoàn toàn hợp lệ cho trận đấu đó. Express cũng hỗ trợ RegExp match. Vì vậy, bạn có thể làm cho một số tuyến đường phù hợp rõ ràng bằng cách sử dụng RegExp.

Một lựa chọn khác là sử dụng app.param như giải thích trong tài liệu API đây http://expressjs.com/api.html#app.param

này cho phép bạn xác định phù hợp với params cho router, do đó bạn có thể có một URL như /api/albums/:albumId nơi :albumId có phải là số, bạn cũng có thể xác thực albumId vào thời điểm này nếu bạn cũng muốn.

Nhưng trong tất cả, cách thứ hai bạn đang làm nó khá bình thường, thường tôi đặt các tuyến tĩnh ở trên cùng, sau đó là các tuyến động, bắt tất cả, sau đó xử lý lỗi.

+1

Đúng, cách thứ hai là cách TJ Holowaychuk (tác giả của Express) sử dụng trong ví dụ của mình: https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L29 – verybadalloc

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