Node Express — Получение Не может получить или запросить возвращаемую html-страницу

#javascript #node.js #express

Вопрос:

Я создаю внутренний api с помощью node/express и сталкиваюсь с ошибкой. Я пробовал много разных подходов, а также рассматривал здесь множество разных вопросов, но, похоже, ни один из них не решает мою проблему. Насколько я могу судить, мои маршруты структурированы должным образом, но они просто не работают. Возможно, я упускаю что-то очень очевидное, но я в растерянности.

Ниже приведена упрощенная версия моего index.js где я запускаю свой сервер узлов:

 const movies = require("./routes/movies");

app.use("/api/movies/", movies);

const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port ${port}...`));
 

А потом в моем movies.js У меня есть несколько конечных точек:

 // DOES WORK - returns movies with the specifed object
router.get("/genre/:id", async (req, res) => {
  const movies = await Movie.find({ genres: req.params.id });

  if (!movies)
    return res
      .status(400)
      .send(`No movies with genre of id ${req.params.id} could be found.`);

  res.send(movies);
});

// DOESN'T WORK - returns main html page
router.get("/tmdbid/:id", async (req, res) => {
  const movie = await Movie.findOne({
    tmdbID: req.params.id,
  });

  if (!movie)
    return res
      .status(400)
      .send(`No movies with tmdbID of ${req.params.id} could be found.`);

  if (res.status(404)) res.send("Route not found");

  res.send(movie);
});

// DOESN'T WORK - returns Cannot GET /api/movies/title/{title}
router.get("/title/:title", async (req, res) => {
    const movie = await Movie.find({
    title: { $regex: new RegExp(req.params.title, "i")
},});

if (!movie)
    return res
      .status(400)
      .send(`The movie with name of ${req.params.title} could not be found.`);

    res.send(movie);
});
 

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

Ответ №1:

Добавьте консоль.инструкция журнала, чтобы проверить, поражена ли конечная точка или нет. Логика кода в приведенном выше примере кода звучит правильно. Тем не менее, я бы попробовал отформатировать тесто для кода.

  if (!movie){
return res.status(400).send(`No movies with genre of id ${req.params.id} could be found.`);
}
 

Кроме того, убедитесь, что вы не забыли перезагрузить сервер node js.

Комментарии:

1. Ну, конечная точка /title/:title случайным образом начала работать. Я даже ничего не изменил. Консоль конечной точки /tmdb/:id. однако журнал не запускается. Это конечная точка, которая возвращает index.html по какой-то причине.

Ответ №2:

Что там делают эти return заявления? и вы также могли бы улучшить свои утверждения if, такие как ->

 try {
  const movie = await Movie.findOne({
    tmdbID: req.params.id,
  });
  if (!movie) {
   res
   .status(400)
   .send(`No movie(s) could be found.`);
  } else {
    res
    .status(200)
    .send(movie);
  }
} catch(err) {
  res.send(500);
}
 

Ответ №3:

В конце концов я нашел свой ответ, и это была просто ошибка, которую я допустил в URL-адресе при вызове конечной точки, а не в самом коде конечной точки. Вместо того, чтобы звонить на localhost:5000, я звонил на localhost:3000, и, вероятно, поэтому он возвращал index.html из моего приложения react.

Итак, мой код работает как есть. Возможно, это не самая лучшая структура на свете, но пока она работает, я счастлив.

Все еще не понимаю, почему конечная точка /title/:title не работала, а потом вдруг стала работать. Это остается загадкой.