2015-03-03 56 views
1

所以我试图创建我的第一个路径这需要经过筛选使用regexs多个PARAMS:的NodeJS - 添加多个parames的路径与正则表达式

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

我有如下印刷得到endup:

x 100.0 
y .0 

现在看来似乎不喜欢我的正则表达式,但我已经试过USI正则表达式测试仪,看起来很好。有什么我错过了它如何与nodejs和表达?我想能够获得像-100.00和-100这样的点数,但它似乎并不像预期的那样工作。有任何想法吗?另外,将这些正则表达式从路由中分离出来的原因很简单,因为它们是重复的。谢谢。

编辑: 我能够解决这个问题,通过在正则表达式下面添加rh和用if语句添加tesitng来解决这个问题。不过还是想知道这是可能的,而无需使用单独的正则表达式

var pointRegex = new RegExp("^\-?[0-9]{1,3}(\.[0-9]{1,9})?$"); 
+0

这是一个非常糟糕的主意,我唯一能说的是:开始使用[express](http://expressjs.com)或[hapi](http://hapijs.com/)或类似的东西。至少是一个路由器包,它执行正常的参数解析,所以你可以使用像'/ base /:thing /:otherthing'这样的路由,然后在你的处理器中访问'thing'和'otherthing'变量。如果你需要像你在这里展示的那样的正则表达式,那么事情就会发生很大的错误。 – 2015-03-03 00:28:06

+0

@ Mike'Pomax'Kamermans我不太明白,我在示例中使用了express,也许你可以举一个简单的例子来说明你的意思吗?这是我的第一天与JavaScript和节点:( – Sun 2015-03-03 00:32:56

+0

如果您使用快递,不要在您的路线使用正则表达式,使用[参数](http://expressjs.com/4x/api.html#app.param ),然后在你的路由中使用它们,这样在这种情况下,你可以得到'app.get(“/ circle /:radius /:x /:y”,...)',然后在param函数中处理验证。回答即将到来 – 2015-03-03 00:50:25

回答

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)并让通用错误处理程序处理它。如果它们匹配,则会自动落入下一个中间件,并以形成实际响应的函数结束。

+0

这是我想要表达的确切感谢。 – Sun 2015-03-03 09:30:10

1
  1. 看那express-params包。

它使处理/定义路线中的表达式更容易,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.