当前位置: 首页 > 面试题库 >

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

蔡鹏程
2023-03-14
问题内容

假设我的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)和querystring(/albums/artwork?artist=artistName&title=albumTitle)并进行适当的路由,但是事实并非如此?


问题答案:

不,不是。:id将匹配任何东西。因此/api/albums/artwork,该比赛完全有效。Express也支持RegExp匹配。因此,您可以使用RegExp进行显式的数字匹配。

如此处app.paramAPI文档所述,另一种选择是使用:https
:
//expressjs.com/en/api.html#app.param

这使您可以为路由器定义匹配的参数,这样您就可以拥有一个URL,例如必须/api/albums/:albumId在哪里输入:albumId数字,如果需要的话,您也可以albumId在此时验证一个。

但是总的来说,第二种方法是相当正常的,通常我将静态路由放在顶部,然后将动态路由放在最上面,然后捕获所有错误,然后再执行错误处理程序。



 类似资料:
  • 问题内容: 我想了解express.js中的顺序优先级。例如,下面的代码 如果请求来自客户端localhost:3000 / api / abc和localhost:3000 / user / abc,则来自api和用户模块的响应。但是,如果我发出类似localhost:3000 / myName / xyz的请求,则应用程序模块将返回响应。此行为使我担心expressjs的优先顺序以及路由器模块

  • 我有两个拥有相同消费者的AMQ队列。第一个队列(Q1)处理97%的消息,另一个队列(Q2)仅处理3%。问题是,Q2中的消息需要在消息排队后立即进行处理。所以我的问题是,当一条消息在第二季度可用时,我需要以某种方式暂停第一条路线,以吸引消费者。apache camel路由如下所示: 应该使用什么策略?我不认为我可以使用重新定序器,因为Q1可能有成千上万的消息排队,我不能把所有的消息都放在重新定序器批

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 1. 前言 本小节我们介绍如何使用 VueRouter 命名路由。包括如何定义命名路由、如何使用路由名实现路由跳转。本节的学习内容相对简单,相信同学们看完本小节,并对小节中的案例自己实现一遍就可以熟练掌握了。 2. 定义路由名 在之前的小节中,我们学习了如何定义一个路由: const router = new VueRouter({ routes: [ { path: '/

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 本文向大家介绍详解vue-router 命名路由和命名视图,包括了详解vue-router 命名路由和命名视图的使用技巧和注意事项,需要的朋友参考一下 说明:vue-router的几个文章中例子是连贯的,因此对哪块有疑问请翻阅按发表时间排序的其他文章。 一、概述 给路由定义不同的名字,根据名字进行匹配 给不同的router-view定义名字,router-link通过名字进行对应组件的渲染。 二、