2013-07-18 7 views
18

は、私はいくつかは、私のExpressのアプリケーション上でルートをGET持って言う:Node.js Expressルートの命名と順序付け:優先順位の決定方法は?

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

と私は続くjQueryのAJAXスニペット使用してそれらをヒットしようとすると:この呼び出しのヒット、いくつかの理由

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

を2番目のハンドラは/:idパラメータで、明示的な/artworkルートの代わりに使用します。

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

誰かがこれがどうして起こっているのか正確に説明できますか?私はエクスプレスがidパラメータ(/albums/23453243)とクエリ文字列(/albums/artwork?artist=artistName&title=albumTitle)を識別し、適切に経路を決めるのに十分だと思いますが、これはそうではありませんか?

答えて

18

いいえ、それはありません。 :idはすべて一致します。だから/api/albums/artworkはその試合に完全に有効です。 ExpressはRegExpのマッチングもサポートしています。したがって、RegExpを使用して明示的な数値一致のルートを作成できます。これは、あなたが:albumIdが数値でなければなら/api/albums/:albumIdのようなURLを持つことができるようにあなたがルータのためのparamsを照合定義することができ、ここで http://expressjs.com/api.html#app.param

APIドキュメントで説明して

別のオプションは、あなたは、app.paramを使用していますあなたがあまりにも望めば、この時点でalbumIdを検証することができます。

しかし、私はあなたがかなり正常にやっている2番目の方法は、一般的に私は一番上に静的ルートを入れ、次に動的ルート、すべてを捕まえてからエラーハンドラを入れます。

+1

2番目の方法は、TJ Holowaychuk(Expressの作成者)が彼の例で使用する方法です:https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L29 – verybadalloc

関連する問題