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

Posted

技术标签:

【中文标题】Node.js Express 路由命名和排序:优先级如何确定?【英文标题】:Node.js Express route naming and ordering: how is precedence determined? 【发布时间】:2013-07-18 02:53:39 【问题描述】:

假设我的 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 sn-p 来攻击它们:

$("#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) 并进行适当的路由,但情况似乎并非如此?

【问题讨论】:

【参考方案1】:

不,不是。 :id 将匹配任何内容。所以/api/albums/artwork 对那场比赛完全有效。 Express 也支持 RegExp 匹配。因此,您可以使用 RegExp 进行显式数字匹配路由。

另一种选择是使用app.param,如此处 API 文档中所述:https://expressjs.com/en/api.html#app.param

这允许您为路由器定义匹配的参数,这样您就可以拥有像 /api/albums/:albumId 这样的 URL,其中 :albumId 必须是数字,如果您愿意,您也可以在此时验证 albumId

但总的来说,第二种方式你做的很正常,一般我把静态路由放在顶部,然后是动态路由,然后是全部捕获,然后是错误处理程序。

【讨论】:

是的,第二种方式是 TJ Holowaychuk(Express 的创建者)在他的示例中使用的方式:github.com/visionmedia/express/blob/master/examples/…

以上是关于Node.js Express 路由命名和排序:优先级如何确定?的主要内容,如果未能解决你的问题,请参考以下文章

node.JS Express 护照路由

Express 路由丨Node.js-初识 Express

typescript node.js express 路由分隔文件的最佳实践

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

jQuery 函数不适用于 node.js 中的 express.js 路由

用于组织的 Node.js Express 导出路由?