2013-07-18 13 views
18

Say mam kilka tras dostać się na moje wyraźne aplikacji:Node.js Wyznaczanie i porządkowanie trasy ekspresowej: jak ustalany jest priorytet?

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

i próbować trafić je za pomocą naśladowania jQuery AJAX fragment:

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

Z jakiegoś powodu, niniejsze zaproszenie hity drugi moduł obsługi, z parametrem /:id, zamiast wyraźnej trasy /artwork. Zamiana ich tak, aby działały zgodnie z oczekiwaniami:

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

Czy ktoś może wyjaśnić, dlaczego tak się dzieje? Zakładam, że Express będzie na tyle sprytny, aby zidentyfikować id param (/albums/23453243) w porównaniu z querystringiem (/albums/artwork?artist=artistName&title=albumTitle) i odpowiednio wykonać trasę, ale tak się nie wydaje?

Odpowiedz

18

Nie, nie jest. :id dopasuje wszystko. Tak więc /api/albums/artwork jest całkowicie ważny dla tego meczu. Express obsługuje również dopasowanie RegExp. Możesz więc utworzyć wyraźną, dopasowaną numerycznie trasę, używając RegExp.

Inną opcją jest użycie app.param jak wytłumaczyć w dokumentacji API tutaj http://expressjs.com/api.html#app.param

ta pozwala na zdefiniowanie params pasujących do routera więc można mieć URL podobnego /api/albums/:albumId gdzie :albumId musi być liczbą, ty może również sprawdzić poprawność albumId w tym miejscu, jeśli sobie tego życzysz.

Ale ogólnie rzecz biorąc, w drugi sposób robisz to całkiem normalnie, generalnie umieszczam statyczne trasy na górze, potem dynamiczne trasy, łapię wszystkie, a następnie obsługuję błędy.

+1

Tak, druga droga to sposób, w jaki TJ Holowaychuk (twórca Expressu) wykorzystuje w swoich przykładach: https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L29 – verybadalloc