快速路线中的vars阻止任何后续路线

时间:2015-03-25 05:19:19

标签: express parameters routes

我试图在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之前,一切正常。有没有人遇到过这个? 非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

快递路线在管道中工作,这意味着它将首先检查第一条路线,它会看到它接受一个参数,并且它看不到" / 23423423"和' / jedi'。它假定jedi也是一个ID。你应该在前面加上

/planet/:planetID 

他们不要互相冲突。

答案 1 :(得分:0)

Express使用path-to-regexp来匹配路径路径;查看其文档,了解定义路径路径的所有可能性。除此之外,当您在快速中间件中工作时,请注意定义的中间件的顺序。

注意:路由器也是Express中的中间件。

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

  1. /:planetId
  2. /绝
  3. 如果您在顶部定义路线/:planetId,那么它实际上将/jedi视为具有参数planetId = jedi值的相同路线,而如果您放置第二条路线,即; /jedi位于顶部,然后进入完全匹配条件,如果找到/jedi,则只执行相应的操作,否则将尝试使用其他路由定义。

答案 2 :(得分:0)

啊,好的scopsy,现在我看到你的/ 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

再次感谢您的帮助