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

  • 回答 (1)
  • 关注 (0)
  • 查看 (23)

假设我的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);
寒儿寒儿提问于
housenimeia回答于

不,它不是。:id将匹配任何东西。所以/api/albums/artwork对于那场比赛完全有效。Express也支持RegExp匹配。因此,可以使用RegExp制作明确的数字匹配路线。

另一种选择是使用app.param作为API文档中的解释 http://expressjs.com/api.html#app.param

这允许你为路由器定义匹配参数,这样你就可以拥有一个URL,比如/api/albums/:albumIdwhere :albumId必须是数字的,albumId如果你愿意的话,你也可以在这个时候验证一个。

但总体而言,第二种方式是相当正常的,通常我会在顶部放置静态路由,然后放置动态路由,捕获所有错误,然后处理错误。

扫码关注云+社区

领取腾讯云代金券