我试图在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
之前,一切正常。有没有人遇到过这个?
非常感谢您的帮助。
答案 0 :(得分:0)
快递路线在管道中工作,这意味着它将首先检查第一条路线,它会看到它接受一个参数,并且它看不到" / 23423423"和' / jedi'。它假定jedi也是一个ID。你应该在前面加上
/planet/:planetID
他们不要互相冲突。
答案 1 :(得分:0)
Express使用path-to-regexp来匹配路径路径;查看其文档,了解定义路径路径的所有可能性。除此之外,当您在快速中间件中工作时,请注意定义的中间件的顺序。
注意:路由器也是Express中的中间件。
所以你正在使用两条路线:
如果您在顶部定义路线/: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
再次感谢您的帮助