Inicialmente tuve un problema en el que tenía dos rutas separadas y distintas para mi servidor nodeJS así:
Path A para buscar todas las empresas cerca de las coordenadas latlng:
app.get("/:lat/:lng/", (req, res) => { Path B para obtener reseñas de negocios específicos.
app.get('/businesses/:businessID/reviews', (req, res)=>{ Tan pronto como modifique Path A para agregar un parámetro de categoría:
app.get("/:lat/:lng/:searchCategory", (req, res) => { Path B arroja el código de error 400 y ya no obtiene reseñas. Descubrí una solución de "bandaid" simplemente extendiendo la longitud de los parámetros en mi Path A de esta manera:
app.get("/:lat/:lng/category/:searchCategory", (req, res) => {Todo está funcionando como se esperaba ahora, pero quiero saber qué está sucediendo y por qué. Realmente no pude encontrar una explicación. Parece que estoy siguiendo todos los documentos y reglas de ExpressJS. Cualquier idea sería apreciada. ¡Gracias!
Las rutas que consisten completamente en comodines (especificaciones que coinciden con CUALQUIER COSA) generalmente son un problema en Express. Si bien un diseño extremadamente cuidadoso a veces puede hacer que esto funcione, es muy fácil entrar en conflicto con otras rutas porque las rutas comodín coinciden con CUALQUIER COSA, incluso otras cosas que desea usar como rutas diferentes. Además, estas rutas comodín de nivel superior a menudo causan problemas de diseño y expansión en el futuro porque si desea agregar nuevas rutas de nivel superior en el futuro, sus opciones pueden estar limitadas debido a las rutas comodín anteriores que permitió.
La opción más segura y más simple es NO usar rutas comodín de nivel superior en absoluto. Siempre use algún prefijo que no sea comodín en cada ruta como este:
app.get("/loc/:lat/:lng/", ...); Dado que este no es un comodín de nivel superior, no entrará en conflicto con ninguna otra ruta de nivel superior siempre que no comience con /loc .
Luego, también podría tener estos para acompañarlo y ninguno entraría en conflicto:
app.get("/loc/:lat/:lng/:searchCategory", ...) app.get('/businesses/:businessID/reviews', ...) Tenga en cuenta que el tema común aquí es que cada familia de rutas tiene su propio segmento de ruta sin comodín de nivel superior. En el caso de estas tres rutas, usan /loc y /businesses y eso las separa claramente para que no entren en conflicto. Luego, dentro de /loc , tiene uno con dos parámetros y otro con tres parámetros para que no entren en conflicto.
Si quieres saber por qué estos dos entran en conflicto:
app.get("/:lat/:lng/:searchCategory", ...) app.get('/businesses/:businessID/reviews', ...)es porque ambas son URL de tres parámetros y la primera acepta tres comodines, por lo que coincide con CUALQUIER URL de tres parámetros, no solo URL que contienen valores de latitud y longitud.
Técnicamente, podría invertir estas definiciones para separarlas:
app.get('/businesses/:businessID/reviews', ...) app.get("/:lat/:lng/:searchCategory", ...)Y esto funcionaría, pero crear una estructura de URL que entre en conflicto en principio y solo funcione si define todas las rutas en el orden correcto exacto es un dolor de cabeza de mantenimiento en el futuro y es propenso a romperse con un simple cambio en el código o es propenso a quedar atrapado en algún momento en el futuro cuando no pueda extender su estructura de URL de la manera que desea debido a las rutas comodín anteriores.
Por lo tanto, mi consejo es evitar las rutas comodín de nivel superior. Si cada URL que contiene un comodín tiene su propio especificador de nivel superior que no es comodín, entonces todas las rutas comodín se separan de forma única y no hay conflictos ni problemas de ordenación.