Node.js Express路由命名和排序:如何确定优先级?
假设我的Express应用程序中有一些GET路由:
// music albumsapp.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
路由命中第二个处理程序。像这样交换它们使它们按预期运行:
// music albumsapp.get('/api/albums', routes.albums.getAlbums);
app.get('/api/albums/artwork', routes.albums.getAlbumArtwork);
app.get('/api/albums/:id', routes.albums.getAlbum);
有人可以确切解释为什么会这样吗?我认为Express足够聪明,可以识别id参数(/albums/23453243
)和querystring(/albums/artwork?artist=artistName&title=albumTitle
)并进行适当的路由,但是事实并非如此?
回答:
不,不是。:id
将匹配任何东西。因此/api/albums/artwork
,该比赛完全有效。Express也支持RegExp匹配。因此,您可以使用RegExp进行显式的数字匹配。
如此处app.param
API文档所述,另一种选择是使用:https
:
//expressjs.com/en/api.html#app.param
这使您可以为路由器定义匹配的参数,这样您就可以拥有一个URL,例如必须/api/albums/:albumId
在哪里输入:albumId
数字,如果需要的话,您也可以albumId
在此时验证一个。
但是总的来说,第二种方法是相当正常的,通常我将静态路由放在顶部,然后将动态路由放在最上面,然后捕获所有错误,然后再执行错误处理程序。
以上是 Node.js Express路由命名和排序:如何确定优先级? 的全部内容, 来源链接: utcz.com/qa/405628.html