节点Js - 使用正则表达式向路由添加多个参数

时间:2015-03-03 00:05:03

标签: javascript node.js express

所以我试图创建我的第一条路线,该路线采用使用正则表达式过滤的多个参数:

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})?$");

2 个答案:

答案 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)

  1. 查看express-params包。
  2. 它使您的路线中的处理/定义表达更容易,IMO。

    app.param('uid', /^[0-9]+$/);
    
    app.get('/user/:uid', function(req, res, next){
      var uid = req.params.uid;
      res.send('user ' + uid);
    });
    
    1. 您的路线模式可能会简化。
    2. 你可能有理由做你做了什么,但你应该能够把它构建成。

      /circle/:radius/:x/:y
      
      1. 所以一起
      2. 这就像是

        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.