我试图在我的API中创建以下路线:
/users/compare
问题是......我不能,因为我已经拥有:
/users/:slug
所以......当我尝试访问/users/compare
时,我会访问/users/:slug
我能解决这个问题吗?
app.get('/users/:slug', ......);
app.get('/users/compare', ......);
一条路线用于创建用户,另一条路线用于确认登录凭据。
非常感谢。
答案 0 :(得分:2)
让我解释一下这里发生了什么。
路由按您声明的顺序进行评估。如果你有重叠的路线(多个路线可以匹配给定的URL),那么你声明它们的顺序非常重要,因为匹配它的第一个将处理它而其他路线不会得到它。
您可能已经意识到这条路线:
app.get('/users/:slug', ......);
将匹配/users/anything
。所以,这几乎意味着任何以/users/
开头的东西都会匹配这条路线。如果您在app.get('/users/compare', ......);
路线之前放置该路线,那么/users/:slug
将匹配网址/users/compare
,它将处理该请求。因此,/users/compare
的路由永远不会被调用。
如果你先放置/users/compare
,那么它会在网址/users/compare
上获得第一个破解,并且它会正常工作。
通常,最好设计一个没有这些类型冲突的URL方案。我不能说你永远不应该这样做,因为有时会有完全正常的例外,只需要你适当地订购你的路线,但一般来说,如果有不同的/更好的方式来组织你的URL,你会想避免它设计不会造成这种冲突。
我不确切地知道你在这里做了什么,但也许你应该这样做:
app.get('/userscmd/compare', ......);
app.get('/users/:slug', ......);
或:
app.get('/userscompare', ......);
app.get('/users/:slug', ......);
您也可以这样做:
app.get('/users/:slug', function(req, res) {
var param = req.params.slug;
if (param === "compare") {
// special slug word
} else {
// regular slug
}
});
答案 1 :(得分:0)
试试这个....路线的顺序应该有助于解决你的问题(尽管这不是一个可维护性的好习惯)
首先添加此路线
app.get('/ users / compare',......);
稍后添加此路线
app.get('/ users /:slug',......);