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程序。