Javascript Nodejs-使用regex向路由添加多个参数
因此,我尝试创建我的第一条路由,该路由使用多个参数,这些参数使用regexs进行过滤:Javascript Nodejs-使用regex向路由添加多个参数,javascript,node.js,express,Javascript,Node.js,Express,因此,我尝试创建我的第一条路由,该路由使用多个参数,这些参数使用regexs进行过滤: router.get('/circle/:radius([0-9]{1,3})/Xposition/:x(\-?[0-9]{1,3}(\.[0-9]{1,9})?)/Yposition/:y(\-?[0-9]{1,3})', function(req, res, next) { console.log('x ' + req.params.x); console.log('y ' + req.params.y)
router.get('/circle/:radius([0-9]{1,3})/Xposition/:x(\-?[0-9]{1,3}(\.[0-9]{1,9})?)/Yposition/:y(\-?[0-9]{1,3})', function(req, res, next) {
console.log('x ' + req.params.x);
console.log('y ' + req.params.y);
});
在做了这样的事情之后:
我最后打印了以下内容:
x 100.0
y .0
它似乎不喜欢我的正则表达式,但我已经尝试使用正则表达式测试仪,它似乎很好。我对nodejs和express的工作方式有什么遗漏吗?我希望能够得到像-100.00和-100这样的分数,但它似乎没有像预期的那样工作。有什么想法吗?还有什么简单的方法可以将这些正则表达式从路由中分离出来,因为它们本质上是重复的。谢谢
编辑:
我可以通过在regex下面添加rh和使用if语句测试来解决这个问题。但我仍然想知道,如果不使用单独的正则表达式,这是否可行
var pointRegex = new RegExp("^\-?[0-9]{1,3}(\.[0-9]{1,9})?$");
app.param('uid', /^[0-9]+$/);
app.get('/user/:uid', function(req, res, next){
var uid = req.params.uid;
res.send('user ' + uid);
});
/circle/:radius/:x/:y
app.param('x', pointRegex);
app.param('y', pointRegex);
app.param('radius', pointRegex);
router.get('/circle/:radius/:x/:y', function(req, res, next) {
console.log('x ' + req.params.x);
console.log('y ' + req.params.y);
console.log('radius ' + req.params.radius);
});
有关详细信息,不要在路由中使用此类正则表达式,请先在路由中使用这些正则表达式,然后再在路由中使用它们,这样在这种情况下,您可以:
app.get("/circle/:r/:x/:y", function(req, res) {
var r = req.params.r,
x = req.params.x,
y = req.params.y,
res.json({......});
});
具有三个参数处理程序:
app.param("r", function(req, res, next, r) {
if(r does not validate) next(new Error("bad radius"));
req.params.r = r;
});
app.param("x", function(req, res, next, x) {
if(x does not validate) next(new Error("bad x coordinate"));
req.params.x = x;
});
app.param("y", function(req, res, next, y) {
if(y does not validate) next(new Error("bad y coordinate"));
req.params.y = y;
});
因此,您可以在param处理程序中处理验证。他们不符合他们需要的吗?调用
next(err)
并让通用错误处理程序处理它。如果它们确实匹配,那么您将自动进入下一个中间件,以形成实际响应的函数结束。这是一个非常糟糕的主意,我唯一能说的是:开始使用or或类似的东西。至少是一个路由器包,它可以进行正常的参数解析,这样您就可以使用像/base/:thing/:otherthing
这样的路由,然后可以访问处理程序中的thing
和otherthing
变量。如果你需要一个正则表达式,就像你在这里展示的一样,有些地方出了严重的问题。@Mike'Pomax'Kamermans我不太明白,我在示例中使用的是express,也许你可以举一个简单的例子来说明你的意思?这是我使用javascript和node的第一天:(如果您使用的是express,请不要在路由中使用正则表达式,在路由中使用它们,然后再使用它们,这样在这种情况下,您将获得app.get(“/circle/:radius/:x/:y”,…)
,然后在param函数中处理验证。请稍后回答。