我有两条路线/api/persons/:personId
和/api/persons/contact
,其中:personId
是一个ObjectId。
当我点击api/persons/contactS
(带有'S'字符)时,它会点击api/persons/:personId
的API代码,而不是给出404。
那么我怎样才能区分这两条路线。我想在向控制器提供句柄之前先定义我的路线,从而限制我的代码控制。
答案 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)
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();
});
});