解决可选的路由参数

时间:2013-12-18 15:54:34

标签: node.js routing restify

您好我有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

我不希望在每个参数上检查空参数并重定向或传递给下一个...

这似乎是一个普遍的事情,也应该击中其他人...所以你有什么打算在网上没有得到404的火车斜杠

2 个答案:

答案 0 :(得分:27)

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

var restify = require('restify');

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

有关详细信息,请查看此Github Issue。关于ReST的原始文件表明斜杠具有特殊含义,但是,ReST不是标准,只是指南。因此,斜杠的使用/省略是API设计者的偏好和API的语义的问题。一致性是唯一重要的事情。

我嘲笑并测试了您的设置,这已经确认可以解决您的问题:

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);
});

HTTP测试:

$ 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

答案 1 :(得分:1)

Restify在v4 +中为可选参数添加了支持,这些请求遵循与明确相同的大纲:

router.get('/user/:id?', async (req, res, next)=>{
    // Do Stuff
})

这意味着如果我们向/user/运行获取请求,则仍会调用上述路由。