Node.js Express路由命名和sorting:如何确定优先级?

假设我的Express应用程序有几条GET路线:

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

出于某种原因,这个调用命中第二个处理程序,使用/:id参数,而不是显式/artwork路线。 像这样交换它们使其function如预期的那样:

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

有人可以解释为什么会发生这种情况吗? 我会假设快车会很聪明,以确定一个身份证参数( /albums/23453243 )与查询string( /albums/artwork?artist=artistName&title=albumTitle )和适当的路线,但这似乎并不是这样的情况?

不,不是。 :id将匹配任何东西。 所以/api/albums/artwork对于那个比赛是完全有效的。 Express也支持RegExp匹配。 所以你可以使用RegExp做一个明确的数字匹配路线。

另一个select是使用app.param作为API文档中的解释http://expressjs.com/api.html#app.param

这允许你为路由器定义匹配的参数,所以你可以有一个像/api/albums/:albumId这样的URL :albumId必须是数字的,你也可以在这个时候validation一个albumId

但总的来说,第二种方法是相当正常的,一般我把静态路由放在最上面,然后dynamic路由,全部捕获,然后是error handling程序。