ExpressJs:区分两条相似的路线

时间:2015-04-27 03:59:29

标签: node.js express

我有两条路线/api/persons/:personId/api/persons/contact,其中:personId是一个ObjectId。

当我点击api/persons/contactS(带有'S'字符)时,它会点击api/persons/:personId的API代码,而不是给出404。

那么我怎样才能区分这两条路线。我想在向控制器提供句柄之前先定义我的路线,从而限制我的代码控制。

4 个答案:

答案 0 :(得分:1)

您需要在服务器端的req上进行某种验证。这样做是因为它认为你发送的是一个人。我确定你的personId匹配某种格式,所以添加一些检查personId格式的验证。如果不匹配,则返回404(或任何适合您情况的错误)

例如,

var x = req.params.personId
if (x.length !== 10 || x.match(/^[0-9]+$/) != null; ) {
  res.send(404)
}

这样可以确保personId在将其作为personId接受之前包含10个数字。

答案 1 :(得分:0)

您需要在路线中使用正则表达式来区分可能是personId(可能是所有数字)和什么不是。

这里有一个在路线中使用正则表达式的示例:https://stackoverflow.com/a/13665354/280842

答案 2 :(得分:0)

为什么要给404? contactS可以是有效的personId

您需要在路线中添加正则表达式

/api/persons/:personId

因此它只与有效的ObjectId匹配,然后它将忽略contactS并返回404。

答案 3 :(得分:0)

Express depends上的{p> path-to-regexp用于解析路径路径,它支持带有占位符的specifying custom patterns

app.get('/api/persons/:personId([\\dA-Fa-f]+)', ...);

app.get('/api/persons/contact', ...);

您还可以使用app.param()验证personId何时可以使用它:

app.param('personId', function (req, res, next, id) {
    Persons.findById(id, function (err, person) {
        if (err)
            return next(err);
        if (!person)
            return next('route');

        req.person = person;
        next();
    });
});