web-dev-qa-db-fra.com

Plusieurs paramètres de route facultatifs dans Express?

J'utilise Express pour gérer un itinéraire au format /articles/:year/:month/:day, où année, mois et jour sont facultatifs.

  • Si aucun des trois paramètres n'est donné, tous les articles seront retournés;
  • Si l'année est donnée, les articles de cette année seront retournés;
  • Si l'année et le mois sont indiqués, les articles de cette année et de ce mois seront retournés;
  • Si les trois paramètres sont donnés, les articles de cette année, mois et jour seront retournés.

Ma question est, comment puis-je les rendre facultatifs? Avec l'itinéraire actuel que j'ai défini, à moins que les trois paramètres ne soient présents, il ne pourra pas être résolu et tombera dans l'itinéraire par défaut.

21
CLDev

Le guide de expressjs to routing mentionne:

Express utilise path-to-regexp pour faire correspondre les chemins de la route; voir le path-to-regexp documentation pour toutes les possibilités de définition de chemins de la route. Express Route Tester est un outil pratique pour tester les bases Itinéraires express, bien qu'il ne prenne pas en charge la correspondance de modèle.

Fondamentalement, vous pouvez utiliser le caractère ? pour rendre le paramètre facultatif.

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

Édité dans le but d'avoir les 3 différentes options en une réponse. Nous remercions @ hjpotter92 pour sa réponse regex.

Avec URL Params

Avec 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;
}

Sans regex

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);
}

Définissez les 3 chemins que vous souhaitez prendre en charge et réutilisez la même fonction

Avec les paramètres de requête

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;
}

L'URL de ce noeud final ressemblera à ceci:

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

Ce type de route ne fonctionnera probablement pas à cause des traits de soulignement dans les paramètres transmis.

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

Je vous suggère donc d'utiliser le système de routage suivant si le routage ne fonctionne pas. Vous pourrez y envoyer plusieurs paramètres.

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