重新定义可选的路由参数

您好,我有一个restify.io路由问题

好像restify不支持"?" 为express.js做的可选参数。

 server.get('/users',function(req,res,next){}); server.get('/users/:id',function(req,res,next{}); // I even tried server.get('/users/',function(req,res,next){}); 

所以当我跑步时,一切都按预期运作

1

 http://localhost/users 

这显示了我所有的用户

2

 http://localhost/users/1 

这显示了用户ID为1

 http://localhost/users/ //(note trailing slash) 

找不到资源,因为这个被解释为空参数而不是路由#1

我不想检查每个空的参数和redirect或传递给下一个…

这似乎是一个普通的事情,也应该打其他人…所以你怎么做,以获得一个404在url的训练斜杠

您需要在代码的开头附近添加restify.pre.sanitizePath()

 var restify = require('restify'); var server = restify.createServer(); server.pre(restify.pre.sanitizePath()); // Add this line 

有关更多详细信息,请参阅此Github问题 。 关于ReST的原始文件表明斜杠有特殊的含义,但是,ReST不是一个标准,只是一个指导。 因此,使用/省略斜线是APIdevise者的偏好和API的语义的问题。 一致性是唯一重要的事情。

我嘲笑和testing你的设置,这已被证实可以解决你所描述的问题:

 var restify = require('restify'); var server = restify.createServer(); server.pre(restify.pre.sanitizePath()); var users = [ { id: 1, name: 'Sean' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Ana' } ] server.get('/users', function (req, res, next) { console.log(req.query()); res.send(users); }); server.get('/users/:id', function (req, res, next) { var user = users.filter(function (user) { return user.id === req.params.id; }); res.send(user); }); server.listen(8080, function() { console.log('%s listening at %s', server.name, server.url); }); 

HTTPtesting:

 $ curl localhost:8080/users <- Returns all users $ curl localhost:8080/users/ <- Returns all users $ curl localhost:8080/users/1 <- Returns user with id 1 $ curl localhost:8080/users?name=sean <- Logs querystring $ curl localhost:8080/users/?name=sean <- Logs querystring