不止一个获取的猫鼬和快速路由器问题
Mongoose and express router issue with more than one get
大家早上好,
我陷入了这个问题,找不到解决的方法。我认为真的很容易,但我找不到错误。我只是想用 express 创建 3 条路线来获取所有活跃的锦标赛,只有一个是用参数选择的,最新的 3 个用于主页。
为此,我创建了三个 gets 来在我的控制器中使用不同的函数获取数据。但是,如果我尝试使用路由“/activetournament”的邮递员获取数据,我会收到此错误。删除它的唯一方法是评论其他 2 个。谢谢你的回答。
(node:17203) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "activetournaments" at path "_id" for model "Tournament"
const tournamentsCtrl = {};
const Tournaments = require("../models/Tournaments");
tournamentsCtrl.createTournament = async (req, res) => {
console.log(req.body);
const newTournament = new Tournaments(req.body);
await newTournament.save();
res.json({ message: "Tournament Saved" });
}
tournamentsCtrl.getTournament = async (req, res) => {
const tournament = await Tournaments.findById(req.params.id);
res.json(tournament);
}
tournamentsCtrl.homeTournament = async (req, res) => {
const tournament = await Tournaments.find().sort({ _id: 1 }).limit(3);
res.json(tournament);
}
tournamentsCtrl.actTournament = async (req, res) => {
const tournament = await Tournaments.find({ "signup_dates.signup_end_date": { $gt: new Date() } });
res.json(tournament);
}
module.exports = tournamentsCtrl;
const router = require("express").Router(); // Enrutador
const tournamentsCtrl = require('../controllers/tournaments.controller');
const auth = require('../middleware/auth');
//Create tournaments
//api/tournaments
router.post('/', tournamentsCtrl.createTournament);
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/:id', tournamentsCtrl.getTournament);
router.get('/', tournamentsCtrl.homeTournament);
module.exports = router;
看了你的controller和routes代码,我发现问题出在哪里了。
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/:id', tournamentsCtrl.getTournament);
对于express.js,以上两条路由是一样的,在第二条路由中,代替:id
,它考虑activetournaments
,并进一步进行。因此,当您点击 API /activetournaments
时,它会调用两条路线
- router.get('/activetournaments', tournamentsCtrl.actTournament);
- router.get('/:id', tournamentsCtrl.getTournament);
您的 getTournament 方法接受 id,并且该 id 来自 req.params,在本例中为 activetournaments
。
这个问题的解决方案是,使用不同的约定来创建路由,例如,
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/tournamentById', tournamentsCtrl.getTournament);
大家早上好,
我陷入了这个问题,找不到解决的方法。我认为真的很容易,但我找不到错误。我只是想用 express 创建 3 条路线来获取所有活跃的锦标赛,只有一个是用参数选择的,最新的 3 个用于主页。 为此,我创建了三个 gets 来在我的控制器中使用不同的函数获取数据。但是,如果我尝试使用路由“/activetournament”的邮递员获取数据,我会收到此错误。删除它的唯一方法是评论其他 2 个。谢谢你的回答。
(node:17203) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "activetournaments" at path "_id" for model "Tournament"
const tournamentsCtrl = {};
const Tournaments = require("../models/Tournaments");
tournamentsCtrl.createTournament = async (req, res) => {
console.log(req.body);
const newTournament = new Tournaments(req.body);
await newTournament.save();
res.json({ message: "Tournament Saved" });
}
tournamentsCtrl.getTournament = async (req, res) => {
const tournament = await Tournaments.findById(req.params.id);
res.json(tournament);
}
tournamentsCtrl.homeTournament = async (req, res) => {
const tournament = await Tournaments.find().sort({ _id: 1 }).limit(3);
res.json(tournament);
}
tournamentsCtrl.actTournament = async (req, res) => {
const tournament = await Tournaments.find({ "signup_dates.signup_end_date": { $gt: new Date() } });
res.json(tournament);
}
module.exports = tournamentsCtrl;
const router = require("express").Router(); // Enrutador
const tournamentsCtrl = require('../controllers/tournaments.controller');
const auth = require('../middleware/auth');
//Create tournaments
//api/tournaments
router.post('/', tournamentsCtrl.createTournament);
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/:id', tournamentsCtrl.getTournament);
router.get('/', tournamentsCtrl.homeTournament);
module.exports = router;
看了你的controller和routes代码,我发现问题出在哪里了。
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/:id', tournamentsCtrl.getTournament);
对于express.js,以上两条路由是一样的,在第二条路由中,代替:id
,它考虑activetournaments
,并进一步进行。因此,当您点击 API /activetournaments
时,它会调用两条路线
- router.get('/activetournaments', tournamentsCtrl.actTournament);
- router.get('/:id', tournamentsCtrl.getTournament);
您的 getTournament 方法接受 id,并且该 id 来自 req.params,在本例中为activetournaments
。
这个问题的解决方案是,使用不同的约定来创建路由,例如,
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/tournamentById', tournamentsCtrl.getTournament);