Así que estoy desarrollando una funcionalidad de paginación personalizada con express y mongoose. Tengo un parámetro de obtención llamado página y necesito cambiar el valor para cada página diferente. El problema es que la forma en que lo hago sigue agregando pares clave-valor de "página" a la URL como esta "&page=1&page=1&page=1". Esto se debe a que no cambio simplemente el valor de "página", sino que agrego el par clave-valor cada vez de la siguiente manera:
currentPageUrl: req.originalUrl + '&page=' + currentPageSolo necesito cambiar el valor de la tecla "página". ¿Cómo puedo lograr esto? Cualquier consejo, función de ayuda expresa o solución personalizada ayudaría mucho. ¡Gracias por adelantado!
Si sabe que el parámetro page=xxx ya está ahí, puede usar .replace() :
currentPageUrl: req.originalUrl.replace(/page=[^&]+/, "page=" + currentPage)Si no está seguro de si está allí, primero debe probarlo:
let newUrl; if (req.originalUrl.indexOf("page=") !== -1) { newUrl = req.originalUrl.replace(/page=[^&]+/, "page=" + currentPage); } else if (req.originalUrl.indexOf("?") === -1) { newUrl = req.originalUrl + "?page=" + currentPage); } else { newUrl = req.originalUrl + "&page=" + currentPage); }Varios casos de prueba:
function updatePage(origUrl, currentPage) { let newUrl; if (origUrl.indexOf("page=") !== -1) { newUrl = origUrl.replace(/page=[^&]+/, "page=" + currentPage); } else if (origUrl.indexOf("?") === -1) { newUrl = origUrl + "?page=" + currentPage; } else { newUrl = origUrl + "&page=" + currentPage; } return newUrl; } // test cases console.log(updatePage("http://somedomain.com/somePath?page=3", 5)); console.log(updatePage("http://somedomain.com/somePath?whatever=something&page=3", 5)); console.log(updatePage("http://somedomain.com/somePath", 5)); console.log(updatePage("http://somedomain.com/somePath?page=3&whatever=something", 5)); También puede usar la biblioteca de url para analizar la URL en sus partes, cambiar una parte y luego regenerar la URL completa:
const url = require('url'); let parsedUrl = url.parse(req.originalUrl, true); parsedUrl.query.page = currentPage; delete parsedUrl.search; let newUrl = url.format(parsedUrl);Escribí una función que toma una url, un parámetro y el nuevo valor que quieres que sea. Creo que esto hace exactamente lo que quieres.
const url = require('url') uri = 'http://example.com/cat?page=1&rand=18347109823' function change_parameter(uri, parameter_name, new_value){ parsed_uri = url.parse(uri, true) parameters = [] for ( key in parsed_uri.query ) { if ( key == parameter_name ) { parameters.push( key + "=" + new_value ) } else { parameters.push( key + "=" + parsed_uri.query[key] ) } } return parsed_uri.protocol + "//" + parsed_uri.hostname + "?" + parameters.join("&") } console.log(change_parameter(uri, 'page', '3'))PRODUCCIÓN
$ node so.js http://example.com?page=3&rand=18347109823Intente usar la biblioteca de direcciones URL. Consulte esta página. https://nodejs.org/docs/latest/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
Puedes modificar tu URL como quieras.
Entonces, en su caso, obtendría url.origin y url.pathname pero dependería de lo que quiera obtener.