web-dev-qa-db-ja.com

オプションのルートパラメータを再定義

こんにちは私は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 

iD1のユーザーを表示します

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

これはルート#1ではなく空のパラメーターとして解釈されるため、リソースが見つからずに失敗します

それぞれの空のパラメータをチェックして、リダイレクトするか、次のパラメータに渡す必要はありません...

これは他の人にも打撃を与えるはずの一般的なことのようです...だから、URLでスラッシュをトレーニングするための404を取得しないようにするためのあなたの見解は何ですか

16
silverfighter

コードの先頭近くに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
28
srquinn

Restifyは、v4 +以降、expressと同じアウトラインに従うリクエストのオプションパラメータのサポートを追加しました。

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

つまり、/user/に対してgetリクエストを実行した場合でも、上記のルートが呼び出されます。

2
li x