【问题标题】:Every GET request method works but the last one won't work, am I doing something wrong?每个 GET 请求方法都有效,但最后一个无效,我做错了吗?
【发布时间】:2021-02-01 05:47:38
【问题描述】:

这里最后一个 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'}))
})

【问题讨论】:

    标签: javascript reactjs express mongoose


    【解决方案1】:

    同一路由路径上有两个链接参数,但它们的名称不同,但它们位于同一根路由上,这就是为什么只执行第一个请求函数的原因(ex:router.get(':year',. .);).

    这就是问题

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

    所以这里是快速修复

    您可以更改年份或名称的根路径 示例:

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

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

    谢谢。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我注意到这一点并将router.get('/:name', ...); 更改为router.get('/stat/:name', ...); 但似乎没有帮助
      • @merenik - 你是什么意思,“它似乎没有帮助”?如果您发送/stat/John 的请求,究竟会发生什么?更改后是否重新启动服务器?不起作用或没有帮助根本无法帮助我们帮助您。我们需要确切地知道会发生什么?你从那个请求中得到了什么?
      • 我重新启动了服务器并发送了一个/stat/John/ 的请求,但什么也没有出现,甚至在控制台日志中也没有。
      • @merenik - /stat/John 似乎也匹配 router.get('/:year/:tournament', ...)。正如我所说,匹配任何内容的顶级通配符确实是一个问题。您可能应该摆脱所有这些。
      • 为什么router.get('/:year, ...)router.get('/getyears, ...) 都可以工作呢?他们不匹配吗?
      猜你喜欢
      • 2018-10-27
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多