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在这一点上,如果你想太多.
但总的来说,你做的第二种方式相当正常,通常我把静态路由放在顶部,然后是动态路由,捕获所有,然后是错误处理程序.
| 归档时间: |
|
| 查看次数: |
9411 次 |
| 最近记录: |