假设我的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
路由来访问第二个处理程序。像这样交换它们会使它们按预期运行:
// 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);
有人能确切地解释为什么会发生这种情况吗?我假设Express足够智能,能够识别id参数(/albums/23453243
)与查询字符串(/albums/artwork?artist=artistName&title=albumTitle
),并进行适当的路由,但事实似乎并非如此?
发布于 2013-07-19 07:41:14
不,不是。:id
将匹配任何内容。所以/api/albums/artwork
对于该匹配是完全有效的。Express也支持RegExp match。因此,您可以使用RegExp创建一个明确的数字匹配路由。
另一种选择是使用app.param
,如此处的API文档所述:https://expressjs.com/en/api.html#app.param
这允许您为路由器定义匹配参数,因此您可以拥有一个类似/api/albums/:albumId
的URL,其中:albumId
必须是数字,如果您愿意,您也可以在这一点验证albumId
。
但总而言之,第二种方法相当正常,通常我会将静态路由放在顶部,然后是动态路由,然后是全部捕获,然后是错误处理程序。
https://stackoverflow.com/questions/17735610
复制相似问题