首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js快速路由命名和排序:如何确定优先级?

Node.js快速路由命名和排序:如何确定优先级?
EN

Stack Overflow用户
提问于 2013-07-19 07:19:11
回答 1查看 13.9K关注 0票数 28

假设我的Express应用程序上有几个GET路由:

代码语言:javascript
复制
// 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代码片段来访问它们:

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

由于某些原因,此调用使用/:id参数而不是显式的/artwork路由来访问第二个处理程序。像这样交换它们会使它们按预期运行:

代码语言:javascript
复制
// 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),并进行适当的路由,但事实似乎并非如此?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

但总而言之,第二种方法相当正常,通常我会将静态路由放在顶部,然后是动态路由,然后是全部捕获,然后是错误处理程序。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17735610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档