猫鼬和快递路由器问题不止一个

时间:2020-05-16 08:46:25

标签: node.js express mongoose express-router

大家早上好

我陷入了这个问题,找不到解决方法。我认为确实很容易,但是我找不到错误。我只是想用express创建3条路线来获取所有活动的锦标赛,只有一条通过参数选择,最后3条用于主页。 为此,我创建了三个获取以在控制器中获取具有不同功能的数据。但是,如果我尝试使用路由“ / 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;

1 个答案:

答案 0 :(得分:1)

观察控制器和路由代码后,我发现问题出在哪里。

router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/:id', tournamentsCtrl.getTournament);

对于express.js,以上两条路由的工作原理相同,在第二条路由中,它代替:id并考虑activetournaments,并继续进行。因此,当您点击API /activetournaments时,它将调用两条路由

  1. router.get('/ activetournaments',toursCtrl.actTournament);
  2. router.get('/:id',锦标赛Ctrl.getTournament);
    您的getTournament方法接受id,并且该id来自req.params,在这种情况下为activetournaments
    解决此问题的方法是,使用不同的约定创建路由,例如
router.get('/activetournaments', tournamentsCtrl.actTournament);
router.get('/tournamentById', tournamentsCtrl.getTournament);