Javascript Nodejs-使用regex向路由添加多个参数

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)

因此,我尝试创建我的第一条路由,该路由使用多个参数,这些参数使用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);
});
在做了这样的事情之后:

我最后打印了以下内容:

 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函数中处理验证。请稍后回答。