86

次のようなルートがあります。

app.all('/path/:namedParam/*splat?',function(req,res,next){
  if(!req.params.length){
    // do something when there is no splat
  } else {
    // do something with splat
  }
});

ただし、これは機能しません。path/foo/bar電話をかけるとルートにヒットしますが、電話をかけるpath/fooと機能しません。

オプションのスプラットパラメータを使用することは可能ですか、それともこれを検出するために正規表現を使用する必要がありますか?

編集

より明確にするために、これが私が達成しようとしている要件です:

  • 1番目と2番目のパラメータが必要です
  • 最初のパラメータは静的で、2番目は名前付きパラメータです。
  • オプションの追加パラメータをいくつでも追加して、ルートにヒットすることができます。
4

7 に答える 7

114

これは、Express4の/pathおよび/path / fooで機能し、*前に注意してください?

router.get('/path/:id*?', function(req, res, next) {
    res.render('page', { title: req.params.id });
});
于 2015-04-09T21:13:15.060 に答える
77

私は同じ問題を抱えてそれを解決しました。これは私が使用したものです:

 app.get('path/:required/:optional*?', ...)

これは、、、path/meow..でpath/meow/voof機能するはずです。path/meow/voof/moo/etc

/との間を削除する?*、最後/もオプションになりますが、オプションの:optional?ままです。

于 2013-01-23T13:42:01.593 に答える
18

これはあなたが求めていることをしますか?

app.all('/path/:namedParam/:optionalParam?',function(req,res,next){
  if(!req.params.optionalParam){
    // do something when there is no optionalParam
  } else {
    // do something with optionalParam
  }
});

Expressのルーティングの詳細については、http://expressjs.com/guide/routing.htmlをご覧ください。

于 2012-04-04T22:30:51.720 に答える
3

これが私がこの問題を解決している現在の方法です。expressがオプションの名前付きparamを使用して任意の数のsplatparamをサポートしているようには見えません。

app.all(/\/path\/([^\/]+)\/?(.+)?/,function(req,res,next){
  // Note: this is all hacked together because express does not appear to support optional splats.
  var params = req.params[1] ? [req.params[1]] : [],
      name = req.params[0];
  if(!params.length){
    // do something when there is no splat
  } else {
    // do something with splat
  }
});

読みやすさと一貫性のために、この名前付きparamsを使用したいと思います。これを可能にする別の回答が表面化した場合は、それを受け入れます。

于 2012-04-05T19:23:17.803 に答える
3

あなたがこのURLを持っているとしましょう:/api/readFile/c:/a/a.txt

あなたがなりたいreq.params.path場合c:

'/api/readFile/:path*

あなたがなりたいreq.params.path場合c:/a/a.txt

'/api/readFile/:path([^/]*)'
于 2019-10-06T08:54:23.787 に答える
0

オプションを使用した上記のソリューションは、Express 4では機能しません。検索パターンを使用していくつかの方法を試しましたが、どちらも機能しませんでした。そして、私はこのメソッドを見つけ、無制限のネストされたパス、http://expressjs.com/api.html#routerに対して起動されたようです

// this will only be invoked if the path starts with /bar from the mount point
router.use('/bar', function(req, res, next) {
  // ... maybe some additional /bar logging ...

  // to get the url after bar, you can try
  var filepath = req.originalUrl.replace(req.baseUrl, "");

  next();
});

すべての/bar、/ bar / z、/ bar / a / b / cなどに一致します。その後、パラメータが入力されていないため、req.originalUrlを読み取ることができます。baseUrlとoriginalUrlを比較して、残りのパスを取得してみてください。

于 2015-03-17T18:14:13.523 に答える
0

この問題を回避するには、URLとに末尾のスラッシュを追加するミドルウェアを組み合わせて使用​​します。ミドルウェアは、のrouter.get('/bar/*?', ...後にすべてを取得し、それがちょうどの場合は/bar/戻ります。訪問者が要求した場合、ミドルウェアは要求にスラッシュを追加し、要求をに変換します。undefined/bar//barexpress-slash/bar/

于 2018-06-15T04:48:32.720 に答える