【问题标题】:Similar Express routing requests with different outputs具有不同输出的类似 Express 路由请求
【发布时间】:2020-02-20 01:49:49
【问题描述】:

我编写了两个不同的 Express 路由请求,它们引用一个对象(其中包含与每部电影相关的电影和数据)。它们应该显示不同的结果,但在结构上完全相同。但是,一种有效,另一种无效。代码如下:

电影按标题

app.get("/movies/:title", (req, res) => {
  res.json(Movies.find((movie) => {
    return movie.title === req.params.title
  }));
});

按类型划分的电影 - 这个不行

app.get("/movies/:genre", (req, res) => {
  res.json(Movies.find((movie) => {
    return movie.genre === req.params.genre
  }));
});

它们指的是以下对象:

let Movies = [{
    id: 1,
    title: "Night of the Living Dead",
    genre: "Classical",
    director: {
      name: "George P. Romero",
      bio: "Lorem ipsum dolor sit amet",
      birth: "01/01/1900",
      death: "01/01/1900"
    },
    imgUrl: "https://z.com/1/img/thumb.jpg"
  },
  {
    id: 2,
    title: "28 days later",
    genre: "Apocalypse",
    director: {
      name: "Danny Boyle",
      bio: "Lorem ipsum dolor sit amet consectetur",
      birth: "01/01/1900",
      death: "01/01/1900"
    },
    imgUrl: "https://z.com/2/img/thumb.jpg"
  },
  {
    id: 3,
    title: "Cell",
    genre: "Apocalypse",
    director: {
      name: "Christopher Hatton",
      bio: "ipsum dolor sit",
      birth: "01/01/1900",
      death: "01/01/1900"
    },
    imgUrl: "https://z.com/3/img/thumb.jpg"
  }
];

第一个请求 localhost:8080/movies/Lorem Ipsum 可以正常工作,但第二个请求 localhost:8080/movies/Classical 或任何其他请求失败。

Express和文件顶部的应用程序的功能调用都可以(它适用于第一个路由请求。

我将不胜感激。提前感谢您的可用性。

【问题讨论】:

    标签: express routing api-design


    【解决方案1】:

    这是因为您对两条路线使用了相同的模式。您尝试使用以下模式匹配两条路线:/movies/:parameter。对于每个请求,Express 都会尝试将请求路径与应用程序中注册的 url 进行匹配。用给定的例子:

    /movies/Lorem Ipsum # Match the /movies/:title
    /movies/Classical # Match the /movies/:title
    

    为什么?因为路由/movies/:title是声明顺序中的第一个。参数名称不算,因为当您发送请求时,express 不知道 "Lorem ipsum" 是 title 而 "Classical" 是 genre !路由声明中的参数名称仅用于在处理程序中调用它,例如 req.params.title

    如何解决?

    更改您的模式,改用查询 (https://expressjs.com/fr/api.html#req.query) !你可以使用这个表格:

    GET /movies?genre=Classical
    GET /movies?title=Lorem%20Ipsum
    

    你会有这样的路线:

    app.get('/movies', (req, res) => {
        if (req.query.title)
             // do title research
        else if (req.query.genre)
             // do genre research
    
        ...
    });
    

    玩得开心!

    【讨论】:

    • 您的回答太好了,Stack Overflow 需要为其质量创造更高水平的崇拜。你回答了我还没有意识到我会回答的问题。最后一个新手的事情:我应该如何为您建议的那些 if-else 行编写条件?非常感谢!
    • 哦,非常感谢!它让我振作起来:) 你可以尝试这样的事情,它可能存在一些更聪明的东西,但我认为这种方式非常简单易懂:app.get("/movies", (req, res) => { const {genre, title } = req.query if (!genre || !title) res.status(422).json({ error: 'genre or title must be set'}) if (genre && Genre != '') return res. json(Movies.find((movie) => movie.genre === Genre)) else if (title && title != '') return res.json(Movies.find((movie) => movie.title == = title)) 否则返回 res.json(Movies.findAll()) })
    猜你喜欢
    • 2018-04-02
    • 2018-01-13
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2017-09-06
    • 2017-06-23
    相关资源
    最近更新 更多