Tengo 2 rutas como,
router.get("/project/:id", (req,res) => { console.log(1); }); router.get("/project/active", (req,res) => { console.log(2); })Cada vez que llamo a la ruta /project/active, se llama a /project/:id route.
Cualquier consejo aquí ayudaría.
Su ruta comodín con :id en ella es codiciosa y coincide con todo, incluida la URL /project/active .
En esta definición de ruta:
router.get("/project/:id", ...) La parte :id es un comodín. Coincide con CUALQUIER COSA. Entonces, /project/anything coincidirá con eso, incluido /project/active . Dado que las rutas coinciden en Express en el orden en que se declaran, su router.get("/project/:id", ...) coincide primero y toma la solicitud.
Hay cuatro formas de evitar esto:
No diseñes ni declares rutas en conflicto que puedan coincidir con una URL en particular. En este caso particular, cambiaría una de sus dos URL a algo único como /project/id/:id y /project/active o /project/:id y /activeproject . Entonces, estos dos controladores de ruta nunca entrarán en conflicto.
Ordena con mucho cuidado tus rutas de la más específica a la menos específica. En este caso, colocaría router.get("/project/active", ...) antes router.get("/project/:id", ...) . Eso le da a la ruta más específica la oportunidad de coincidir antes de que la ruta comodín tome la solicitud. Pero, tenga en cuenta que esto significa que su valor de id nunca puede llamarse active .
Si sus identificaciones son identificables de forma única y diferentes de cadenas como active (como supongamos que una identificación son todos números o siempre contiene algunos números), entonces puede codificar una expresión regular para la identificación que solo coincidiría con sus valores de identificación y no coincidiría con palabras regulares como `activo.
Codifique su ruta comodín para verificar individualmente las cosas que no deberían coincidir y llame a next() para continuar enrutando a otras rutas.
Eso sucede porque especifica una ruta dinámica antes de una ruta específica.
El correcto debe ser:
router.get("/project/active", (req,res) => { console.log(2); }); router.get("/project/:id", (req,res) => { console.log(1); });En Node.js, conocemos algo que se llama pila de middleware. Básicamente, sus solicitudes pasarán a través de middlewares hasta que algo dé una respuesta. Los enrutadores también son ejemplos de middleware.
En este caso, su ruta asume que /active es un id , como definió /:id primero antes de /active . Sucederían cosas diferentes (debería ser su comportamiento esperado) si cambiara el orden.
Referencias: