不止一个获取的猫鼬和快速路由器问题

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 时,它会调用两条路线

  1. router.get('/activetournaments', tournamentsCtrl.actTournament);
  2. router.get('/:id', tournamentsCtrl.getTournament);
    您的 getTournament 方法接受 id,并且该 id 来自 req.params,在本例中为 activetournaments
    这个问题的解决方案是,使用不同的约定来创建路由,例如,
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/tournamentById', tournamentsCtrl.getTournament);