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

J. *_*rsh 22 api routing get node.js 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);
Run Code Online (Sandbox Code Playgroud)

我试图使用以下jQuery AJAX片段来击中它们:

$("#retrieveAlbumArtwork").on("click", function() {
    $.ajax({
        url: "api/albums/artwork",
        type: "GET",
        data: {
            artist: $("#albumArtist").val(),
            title: $("#albumTitle").val()
        },
        // ... callbacks and such
Run Code Online (Sandbox Code Playgroud)

出于某种原因,此调用使用/: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);
Run Code Online (Sandbox Code Playgroud)

有人能解释为什么会发生这种情况吗?我认为Express会足够聪明地识别一个id param(/albums/23453243)与一个querystring(/albums/artwork?artist=artistName&title=albumTitle)并适当地路由,但这似乎不是这样的吗?

Mor*_*len 21

不,不是.:id会匹配任何东西.所以/api/albums/artwork这场比赛完全有效.Express也支持RegExp匹配.因此,您可以使用RegExp创建显式数字匹配路由.

另一种选择是使用app.paramAPI文档中的解释:https://expressjs.com/en/api.html#app.param

这允许您定义匹配PARAMS为路由器,所以你可以有一个网址喜欢/api/albums/:albumId这里:albumId必须是数字,你也可以验证一个albumId在这一点上,如果你想太多.

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

  • 是的,第二种方式是TJ Holowaychuk(Express的创建者)在他的例子中使用的方式:https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L29 (2认同)