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

时间:2013-07-18 23:19:11

标签: node.js api get routing express

说我的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)并适当地路由,但这似乎不是这样的吗?

1 个答案:

答案 0 :(得分:21)

不,不是。 :id会匹配任何内容。因此/api/albums/artwork对该匹配完全有效。 Express也支持RegExp匹配。因此,您可以使用RegExp创建一个显式的数字匹配路由。

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

这允许您为路由器定义匹配的参数,以便您可以使用/api/albums/:albumId这样的网址:albumId必须是数字的,此时您还可以验证albumId你也希望。

但总的来说,你做的第二种方式相当正常,通常我将静态路由放在顶部,然后是动态路由,捕获所有,然后是错误处理程序。