所以我试图创建我的第一条路线,该路线采用使用正则表达式过滤的多个参数:
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);
});
做了这样的事情之后: http://localhost:8080/circle/100/x/100.0/y/100.00
我得到以下打印的结果:
x 100.0
y .0
看起来它并不像我的正则表达式,但我尝试使用正则表达式测试仪,看起来很好。是否有一些我对它如何与nodejs和express一起工作的遗漏?我希望能够获得-100.00和-100之类的积分,但它似乎没有按预期工作。有任何想法吗?还有一种简单的方法可以将这些正则表达式从路径中分离出来,因为它们是重复的。感谢。
编辑: 我能够通过在regex下添加rh并使用if语句添加tesit来解决这个问题。但是如果不使用单独的正则表达式,我们仍然想知道这是否可行
var pointRegex = new RegExp("^\-?[0-9]{1,3}(\.[0-9]{1,9})?$");
答案 0 :(得分:2)
不要在你的路线中使用这种正则表达式,使用parameters然后在你的路线中使用那些,这样你就得到:
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)
并让通用错误处理程序处理它。如果它们匹配,您将自动进入下一个中间件,以形成实际响应的函数结束。
答案 1 :(得分:1)
它使您的路线中的处理/定义表达更容易,IMO。
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);
});
有关详细信息,请look at the app.param section of the Express 4.x docs.