Аналогичные запросы экспресс-маршрутизации с разными выходами - PullRequest
1 голос
/ 23 октября 2019

Я написал два разных запроса экспресс-маршрутизации, которые ссылаются на один объект (который имеет фильмы и данные относительно каждого фильма). Предполагается, что они отображают разные результаты, но структурно точно так же. Тем не менее, один работает, а другой нет. Вот код:

Фильмы по названию

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 и приложения в верхней части файла в порядке (он работает для первого запроса маршрутизации.

Буду признателен за любое просвещение. Спасибо ваванс за доступность.

1 Ответ

0 голосов
/ 24 октября 2019

Это потому, что вы используете один и тот же шаблон для двух маршрутов. Вы пытаетесь сопоставить два маршрута с шаблоном: /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

    ...
});

Веселитесь!

...