web-dev-qa-db-ja.com

Expressの複数のオプションのルートパラメータ?

Expressを使用して、/articles/:year/:month/:dayの形式のルートを処理しています。ここで、年、月、日はオプションです。

  • 3つのパラメーターのいずれも指定されていない場合、すべての記事が返されます。
  • 年を指定すると、その年の記事が返されます。
  • 年と月を指定すると、その年と月の記事が返されます。
  • 3つのパラメーターがすべて指定されている場合、その年、月、日の記事が返されます。

私の質問は、どのようにオプションにするのですか?私が定義した現在のルートでは、3つのパラメーターすべてが存在しない限り、解決できず、デフォルトルートに分類されます。

29
CLDev

expressjsのガイド ルーティングの言及:

Expressは path-to-regexp ルートパスの一致。ルートパスを定義する際のすべての可能性については、正規表現へのパスのドキュメントを参照してください。 Express Route Tester は、基本的なExpressルートをテストするための便利なツールですが、パターンマッチングはサポートしていません。

基本的に、?文字は、パラメーターをオプションにします。

/articles/:year?/:month?/:day?
57
hjpotter92

1つの回答に3つの異なるオプションがあるという目的のために編集されています。彼の正規表現の回答は@ hjpotter92の功績によるものです。

RLパラメータを使用

regexを使用

app.get('/articles/:year?/:month?/:day?', function(req, res) {
  var year = req.params.year; //either a value or undefined
  var month = req.params.month;
  var day = req.params.day;
}

正規表現なし

var getArticles = function(year, month, day) { ... }

app.get('/articles/:year', function(req, res) {
  getArticles(req.params.year);
}
app.get('/articles/:year/:month', function(req, res) {
  getArticles(req.params.year, req.params.month);
}
app.get('/articles/:year/:month/:day', function(req, res) {
  getArticles(req.params.year, req.params.month, req.params.day);
}

サポートする3つのパスを定義し、同じ機能を再利用します

クエリパラメータを使用

app.get('/articles', function(req, res) {
  var year = req.query.year; //either a value or undefined
  var month = req.query.month;
  var day = req.query.day;
}

このエンドポイントのURLは次のようになります。

http://localhost/articles?year=2016&month=1&day=19
23
R. Gulbrandsen

このタイプのルートは、渡されるパラメーターにアンダースコアがあるため、機能しない可能性があります。

app.get('/products/:product_Id/buyers/:buyer_Id', function(req, res) {
  getArticles(req.params.product_Id, req.params.buyer_Id);
}

したがって、ルートが機能していない場合は、次のルートシステムを使用することをお勧めします。そこで、複数のパラメーターを送信できます。

app.get('/products/:productId/buyers/:buyerId', function(req, res) {
  getArticles(req.params.productId, req.params.buyerId);
}
0
nayebare