2015-03-25 56 views
0

我想在我的快遞航線使用瓦爾。它們工作正常,但在路由中使用了一個變量後,任何後面的路由都不起作用。這是一個非常簡單的例子。瓦爾快遞路線阻止任何下列途徑

/////////////////////////////////////////////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不會呈現任何內容。但是,如果我的planet route之前把jedi route,一切工作正常。有沒有人遇到過這個? 非常感謝任何幫助。

回答

0

快速路由在管道中工作,這意味着它將首先檢查第一個路由,它會看到它接受一個參數,並且它看不到「/ 23423423」和「/ jedi」之間的任何區別。它假定jedi也是一個ID。你應該用它作爲前綴

/planet/:planetID 

他們不會相互衝突。

+0

我完成同意回答@scopsy寫的。我想補充一點細節,以便他能夠理解背後的原因。 – NarendraSoni 2015-03-25 14:06:15

+0

嘿謝謝你們。我其實想到'/ planet /:planetID'是要走的路,但那只是給了我'/ planet/jedi'。至於訂單,這是它的工作原理嗎?一旦你有一個變種,你必須結束該文件,並製作另一個路線文件? – nickg 2015-03-26 02:34:34

0

Express使用path-to-regexp用於匹配的路由路徑;請參閱其文檔以獲取定義路徑路徑的所有可能性。除此之外,當您在快遞中間件工作時,請注意定義的中間件的順序。

注意:路由器也是快遞中間件。

所以,你有兩條路線的工作:

  1. /:planetId
  2. /絕地

如果定義在頂部路線/:planetId那麼它實際上把/jedi作爲同路由價值的參數planetId = jedi,而如果你把你的第二條路線即; /jedi頂部然後它的精確匹配條件,如果它發現/jedi那麼只有在執行相應的動作否則將嘗試定義的其他途徑。

0

啊OK 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 

感謝您的幫助