首页 > 解决方案 > 每个 GET 请求方法都有效,但最后一个无效,我做错了吗?

问题描述

此处最后一个 GET 请求方法是唯一不返回任何内容的方法。我控制台日志以查看是否正在发生某些事情,但甚至没有任何内容被记录到控制台。

router.get('/', function(req, res) {
  Golf.find({Year: {$gte: 2021}, "Title": "Corales Puntacana Resort & Club Championship"})
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no scores found'}))
})

//Get data of each player in specific tournament
router.get('/:year/:tournament', function(req, res) {
    let tourny = decodeURI(req.params.tournament)
    let yearly = parseInt(req.params.year)
    Golf.find({Year: yearly, "Title": tourny})
      .then(info => res.status(200).json(info))
      .catch(err => res.status(404).json({msg: 'no scores found'}))
})

//Get years
router.get('/getyears', function(req, res) {
  Golf.find().distinct("Year")
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no years found'}))
})

//Get tournaments in a year
router.get('/:year', function(req, res) {
  let yearly = parseInt(req.params.year)
  Golf.find({Year: yearly}).distinct("Title")
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no years found'}))
})

//Get player names in a specific tournament
router.get('/player/:year/:tournament', function(req, res) {
  let tourny = decodeURI(req.params.tournament)
  let yearly = parseInt(req.params.year)
  Golf.find({Year: yearly, "Title": tourny}).distinct("Name")
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no scores found'}))
})

//Get all player's performances in database
router.get('/:name', function(req, res) {
  let person = decodeURI(req.params.name)
  console.log(person)
  Golf.find({"Name": person})
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no person found'}))
})

这是不起作用的 GET 请求方法。

//Get all player's performances in database
router.get('/:name', function(req, res) {
  let person = decodeURI(req.params.name)
  console.log(person)
  Golf.find({"Name": person})
    .then(info => res.status(200).json(info))
    .catch(err => res.status(404).json({msg: 'no person found'}))
})

标签: javascriptreactjsexpressmongoose

解决方案


这两个路由定义匹配完全相同的路由:

router.get('/:year', ...);
router.get('/:name', ...);

因此,任何单个顶级路径元素都将与第一个/:year路由匹配,并且该/:name路由永远不会有机会匹配任何路由。

您需要更改 URL 设计,以免发生这种冲突。或者,如果:year应该只是数字年份,那么在路由定义中使用更具体的正则表达式,它只匹配年份,而不是所有内容。

仅供参考,与任何顶级路径匹配的路由中的顶级通配符通常是一个有问题的设计,因为它们确实会限制您在未来添加新的顶级路由处理程序的能力,因为router.get('/:year', ...);已经匹配了只有顶级路径的所有内容。


推荐阅读