您好我有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){});
所以当我运行时,一切都按预期工作
http://localhost/users
显示我的所有用户
http://localhost/users/1
显示id为1的用户
http://localhost/users/ //(note trailing slash)
因找不到资源而失败,因为这个资源被解释为空参数而不是路由#1
我不希望在每个参数上检查空参数并重定向或传递给下一个...
这似乎是一个普遍的事情,也应该击中其他人...所以你有什么打算在网上没有得到404的火车斜杠
答案 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/
运行获取请求,则仍会调用上述路由。