Express 具有不同输出的类似快速路由请求

Express 具有不同输出的类似快速路由请求,express,routing,api-design,Express,Routing,Api Design,我已经编写了两个不同的Express路由请求,它们引用单个对象(其中包含与每个电影相关的电影和数据)。它们应该显示不同的结果,但在结构上完全相同。然而,一个有效,另一个无效。代码如下: 按片名分类的电影 app.get("/movies/:title", (req, res) => { res.json(Movies.find((movie) => { return movie.title === req.params.title })); }); 按类型划分的电影

我已经编写了两个不同的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/classic或任何其他方法

Express和文件顶部的应用程序的功能调用正常(它适用于第一个路由请求)


我非常感谢您的启发。提前感谢您的可用性。

这是因为您对两个路由使用相同的模式。您尝试将两个路由与模式匹配:
/movies/:parameter
。对于每个请求,Express都尝试将请求路径与应用程序中注册的URL匹配。举个示例:

/movies/Lorem Ipsum # Match the /movies/:title
/movies/Classical # Match the /movies/:title
为什么?因为路径
/movies/:title
是声明顺序中的第一个。参数的名称不起作用,因为当您发送请求时,express不知道“Lorem ipsum”是
标题和“Classic”是
类型
!路由声明中的参数名称仅用于在处理程序中通过
req.params.title
示例调用它

如何解决这个问题? 更改模式,改用查询()!您可以使用以下表单:

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

    ...
});

祝您玩得开心!

这是因为您对这两个路由使用相同的模式。您尝试将两个路由与模式匹配:
/movies/:parameter
。对于每个请求,Express都尝试将请求路径与应用程序中注册的URL匹配。示例如下:

/movies/Lorem Ipsum # Match the /movies/:title
/movies/Classical # Match the /movies/:title
为什么?因为路径
/movies/:title
是声明顺序中的第一个。参数的名称不起作用,因为当您发送请求时,express不知道“Lorem ipsum”是
标题和“Classic”是
类型
!路由声明中的参数名称仅用于在处理程序中通过
req.params.title
示例调用它

如何解决这个问题? 更改模式,改用查询()!您可以使用以下表单:

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或title必须设置'})if(genre&&genre!='')返回res json(Movies.find((movie)=>movie.genre===genre))else if(title&&title!='')返回res.json(Movies.find((movie)=>movie.title==title))else返回res.json(Movies.findAll())})你的回答非常好,Stack Overflow需要为它的质量创造更高水平的崇拜。你回答了我还没有意识到的问题。最后一个新手问题:我应该如何为你建议的if-else行写条件?非常感谢!非常感谢!这让我振奋:)你可以试试这样的东西,它可能存在一些更聪明的东西,但我认为这种方式非常简单和容易理解:app.get(“/movies”,(req,res)=>{const{genre,title}=req.query if(!genre | | |!title)res.status(422)。json({error:'genre或title必须设置“})if(genre&&genre!=”)返回res.json(movies.find((movie)=>movie.genre===genre)else if(title&&title!='')返回res.json(Movies.find((movie)=>movie.title===title))else返回res.json(Movies.findAll())})