#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 не работала, а потом вдруг стала работать. Это остается загадкой.