node.js - parameter - ¿Múltiples parámetros de ruta opcionales en Express?
route get parameters node js (3)
Estoy usando Express para manejar una ruta que está en el formato de /articles/:year/:month/:day
, donde year, month y day son opcionales.
- Si no se da ninguno de los tres parámetros, se devolverán todos los artículos;
- Si se da el año, los artículos de ese año serán devueltos;
- Si se dan año y mes, los artículos de ese año y mes serán devueltos;
- Si se dan los tres parámetros, se devolverán los artículos de ese año, mes y día.
Mi pregunta es, ¿cómo los hago opcionales? Con la ruta actual que he definido, a menos que los tres parámetros estén presentes, no podrá resolverse y caerá en la ruta predeterminada.
Editado con el propósito de tener las 3 opciones diferentes en una respuesta. Gracias a @ hjpotter92 por su respuesta a expresiones regulares.
Con los parámetros de URL
Con 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;
}
Sin 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);
}
Defina las 3 rutas que desea admitir y reutilice la misma función
Con parámetros de consulta
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;
}
La url para este punto final se verá así:
http://localhost/articles?year=2016&month=1&day=19
La guía de expressjs para las menciones de enrutamiento:
Express usa
path-to-regexp
para hacer coincidir las rutas de ruta; Consulte la documentación de path-to-regexp para ver todas las posibilidades de definir rutas de ruta. Express Route Tester es una herramienta útil para probar rutas Express básicas, aunque no admite la coincidencia de patrones.
Básicamente, puedes usar el ?
Carácter para hacer el parámetro opcional.
/articles/:year?/:month?/:day?
No es probable que este tipo de ruta funcione debido a los guiones bajos en los parámetros pasados.
app.get(''/products/:product_Id/buyers/:buyer_Id'', function(req, res) {
getArticles(req.params.product_Id, req.params.buyer_Id);
}
Por lo tanto, le sugiero que utilice el siguiente sistema de rutas si la ruta no funciona. Allí podrás enviar múltiples parámetros.
app.get(''/products/:productId/buyers/:buyerId'', function(req, res) {
getArticles(req.params.productId, req.params.buyerId);
}