Node.js Express 路由命名和排序:如何确定优先级? [英] Node.js Express route naming and ordering: how is precedence determined?

查看:35
本文介绍了Node.js Express 路由命名和排序:如何确定优先级?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我的 Express 应用程序有一些 GET 路由:

Say I've got a few GET routes on my Express application:

// 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 代码段来点击它们:

and I attempt to hit them using the follow jQuery AJAX snippet:

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

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

For some reason, this call hits the second handler, with the /:id parameter, instead of the explicit /artwork route. Swapping them like so makes them function as expected:

// 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)并适当地路由,但情况似乎并非如此?

Can someone explain exactly why this is happening? I would assume Express would be smart enough to identify an id param (/albums/23453243) versus a querystring (/albums/artwork?artist=artistName&title=albumTitle) and route appropriately, but this doesn't seem to be the case?

推荐答案

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

No it isn't. :id will match anything. So /api/albums/artwork is totally valid for that match. Express does support RegExp match also. So you could make an explicit numeric matching route using RegExp.

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

Another option is using app.param as explained in the API documentation here: https://expressjs.com/en/api.html#app.param

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

This allows you to define matching params for the router so you could have a URL like /api/albums/:albumId where :albumId has to be numeric, you could also validate an albumId at this point if you wished too.

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

But in all, the second way you are doing it fairly normal, generally I put static routes at the top, then dynamic routes, catch all, then error handlers.

这篇关于Node.js Express 路由命名和排序:如何确定优先级?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆