【问题标题】:vars in express routes are blocking any following routes快速路线中的 vars 阻止了以下任何路线
【发布时间】:2015-05-28 16:07:59
【问题描述】:

我正在尝试在我的 Express 路线中使用 vars。它们工作正常,但在我在路线中使用变量后,之后的任何路线都将不起作用。这是一个非常简单的例子。

/////////////////////////////////////////////planets
router.get('/:planetID', function(req, res, next) {
  if(req.params.planetID == "hoth"){
    res.render('index', { 
      title: 'Hoth', 
      subtitle:"Damn its cold"
    });
  }
});

////////////////////////////////////////////////jedi
router.get('/jedi', function(req, res, next) {
  res.render('characters', { 
    title: 'Jedi', 
    subtitle:"why the f is this happening?",  
  });
});

在这个例子中,jedi route 不渲染任何东西。但如果我将jedi route 放在planet route 之前,一切正常。有没有人遇到过这个? 非常感谢您的帮助。

【问题讨论】:

    标签: express parameters routes


    【解决方案1】:

    Express 路由在管道中工作,这意味着它将首先检查第一条路由,它会看到它接受了一个参数,并且它看不出“/23423423”和“/jedi”之间的任何区别。它假设绝地也是一个ID。你应该在它前面加上

    /planet/:planetID 
    

    为了他们不要互相冲突。

    【讨论】:

    • 我完全同意@scopsy 的回答。我想补充一点细节,以便他能够理解背后的原因。
    • 嘿,谢谢大家。我实际上认为'/planet/:planetID' 是要走的路,但这只是给了我'/planet/jedi'。至于订单,这就是它的运作方式吗?一旦你有了一个 var,你必须结束文件并制作另一个路由文件?
    【解决方案2】:

    Express 使用path-to-regexp 匹配路由路径;有关定义路由路径的所有可能性,请参阅其文档。除此之外,当您在使用 express 中间件时,请注意定义的中间件的顺序。

    注意:Router在Express中也是一个中间件。

    所以你正在使用两条路线:

    1. /:行星标识
    2. /绝地

    如果您在顶部定义路由/:planetId,那么它实际上将/jedi 视为具有参数planetId = jedi 的相同路由,而如果您放置第二条路由,即; /jedi 在顶部然后它会去精确匹配条件,如果它找到 /jedi 然后它只执行相应的操作,否则它将尝试定义其他路由。

    【讨论】:

      【解决方案3】:

      啊,好吧,现在我明白了您的 /23423423 示例是如何应用的。对不起,我没有发布足够的信息,我意识到了。如果没有找到匹配项,我必须使用 if() 语句告诉路由继续前进。我使用next() function 和一个计数器变量来做到这一点。

      router.get('/:planetID', function(req, res, next) {
        var counter = 0;
          planetJSON.planets.forEach(function(item){
            counter++;
            if(item.link == req.params.planetID){
              planetDisplay.name = item.name;
              planetDisplay.text = item.text;
              planetDisplay.image = item.image;
      
              res.render('index', { 
                planetGrab:planetDisplay,
                planetList:planetJSON
              });
      
            }//end if()
            else if(counter + 1 > planetJSON.planets.length){
              next();
            }
      
         });//end for each()
      });//end router.get
      

      再次感谢您的帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        相关资源
        最近更新 更多