快速api中的嵌套路由

时间:2015-11-20 00:13:41

标签: node.js express routes nested

我试图在我的API中创建以下路线:

/users/compare

问题是......我不能,因为我已经拥有:

/users/:slug

所以......当我尝试访问/users/compare时,我会访问/users/:slug

我能解决这个问题吗?

app.get('/users/:slug', ......);
app.get('/users/compare', ......);

一条路线用于创建用户,另一条路线用于确认登录凭据。

非常感谢。

2 个答案:

答案 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',......);