gpt4 book ai didi

Node.js Express 路由命名和排序 : how is precedence determined?

转载 作者:IT老高 更新时间:2023-10-28 22:06:57 28 4
gpt4 key购买 nike

假设我的 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) 和路由合适,但似乎不是这样?

最佳答案

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

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

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

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

关于Node.js Express 路由命名和排序 : how is precedence determined?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com