2013-07-18 9 views
18

dire che ho avuto un paio di percorsi darmi sui Application Express:Node.js Express naming e ordinamento delle route: come viene determinata la precedenza?

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

e tento di colpirli con il seguire jQuery AJAX frammento:

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

Per qualche ragione, questo colpi di chiamata il secondo gestore, con il parametro /:id, anziché il route esplicito /artwork. Scambiarli in questo modo li fa funzionare come previsto:

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

Qualcuno può spiegare esattamente perché questo sta accadendo? Suppongo che Express sia abbastanza intelligente da identificare un parametro id (/albums/23453243) rispetto a una querystring (/albums/artwork?artist=artistName&title=albumTitle) e instradare in modo appropriato, ma questo non sembra essere il caso?

risposta

18

No, non lo è. :id corrisponderà a qualsiasi cosa. Quindi /api/albums/artwork è totalmente valido per quella partita. Express supporta anche la corrispondenza RegExp. Quindi potresti creare un percorso di corrispondenza numerica esplicita usando RegExp.

Un'altra opzione sta usando app.param come spiega nella documentazione delle API qui http://expressjs.com/api.html#app.param

Ciò consente di definire le corrispondenti params per il router in modo si potrebbe avere un URL come /api/albums/:albumId dove :albumId deve essere numerica, è potrebbe anche convalidare un albumId a questo punto se lo desideri anche tu.

Ma in tutto, il secondo modo in cui lo stai facendo è abbastanza normale, in genere metto i percorsi statici in alto, poi percorsi dinamici, cattura tutto, quindi gestori di errori.

+1

Sì, il secondo modo è il modo in cui TJ Holowaychuk (creatore di Express) utilizza nei suoi esempi: https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L29 – verybadalloc