解决可选的路由参数

sil*_*ter 16 routing node.js 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){});
Run Code Online (Sandbox Code Playgroud)

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

1

http://localhost/users
Run Code Online (Sandbox Code Playgroud)

这显示了我的所有用户

2

http://localhost/users/1 
Run Code Online (Sandbox Code Playgroud)

它显示id为1的用户

http://localhost/users/ //(note trailing slash)
Run Code Online (Sandbox Code Playgroud)

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

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

这似乎是一个普遍的事情,也应该击中其他人...所以你有什么看法,没有得到404的网址中的训练斜线

srq*_*inn 28

您需要restify.pre.sanitizePath()在代码的开头附近添加一些内容:

var restify = require('restify');

var server = restify.createServer();
server.pre(restify.pre.sanitizePath()); // Add this line
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看此Github问题.关于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);
});
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)