Soy nuevo en Express, así que me gustaría que me ayudaran. Necesito crear un enrutador para obtener algunos valores de un punto final que será el siguiente (no puedo modificar el punto final, es un requisito)
../house/1/us/ny&zipcode=12345Lo intenté
router.get("/:id/:country/:state") y obtengo la identificación, el país y el estado con req.params Obtengo id=1 country=us y por el valor del estado, obtengo "ny&zipcode=12345" pero en realidad quiero obtener ambos
estado=ny código postal=12345
Probé con req.query pero no funciona o quizás lo estoy usando incorrectamente ¿Alguna sugerencia? Gracias por adelantado
El primer problema (¿supongo?) en el código que veo es que estás usando & en lugar de ? para iniciar los parámetros de consulta; usamos & para separar pares de valores clave (como foo=bar&baz=hello ). Entonces, es posible que desee verificar eso una vez.
Si cambia el & a un ? , puede acceder a él usando req.query.<objectName> .
También solo su edición, y para que funcione podemos trabajar con /house/:id/:country/:stateAndZip , necesitamos hacer algunos cambios.
Probablemente usaría este enfoque:
const { stateAndZip } = req.params; const [ state, zipCode ] = stateAndZip.split( '&' ); // Here, state contains 'ny' and `zipCode` is of the work `zipcode=XXXXX`. const [ , formattedZipCode ] = zipCode.split( '=' ); // Or use https://nodejs.org/api/querystring.html // formattedZipCode is XXXXX. Hay algunos problemas con esta solución; el primero es que esto supone que el zipcode es el primer argumento después & . Si desea una forma más genérica de hacerlo, hágamelo saber.
Tomando la solución de arriba y suponiendo que tenemos una lista desordenada donde el zipcode puede estar en cualquier lugar, podemos hacer lo siguiente:
const qs = require( 'querystring' ); const { stateAndZip } = req.params; const [ state, queryParams ] = stateAndZip.split( '&' ); const decodedQueryParams = qs.parse( queryParams ); // decodedQueryParams will be an object with the property `zipcode`. Un problema aquí es que es posible que tengamos un ampersand ( & ) en la propia URL, puede llevar esta solución un paso más allá asumiendo que todos los nombres de estado en su forma abreviada tienen solo 2 caracteres y se leen hasta el & , y analizan el cadena restante usando querystring .
Como se mencionó, su requisito es un poco extraño. Sin embargo, la definición de ruta del enrutador expressjs es muy elástica (busque la sección Rutas de Route paths en la documentación oficial ). Puedes definir una ruta con tu patrón así:
/:id/:country/:state&zipcode=:zipcodePruebas rápidas
Utilice Express Route Tester , coloque /house/:id/:country/:state&zipcode=:zipcode en el campo Route y /house/1/us/ny&zipcode=12345 en el campo Path .
Ejemplo completo
import * as express from 'express'; const express = require("express"); const app = express(); const houseRouter = express.Router(); houseRouter.get("/:id/:country/:state&zipcode=:zipcode", (req) => { console.log(req.params); }); app.use('/house', houseRouter); app.listen(3000); Para probar, llame a http://localhost:3000/house/1/us/ny&zipcode=12345 desde postman /navegador.
La consola registraría:
{ id: '1', país: 'nosotros', estado: 'ny', código postal: '12345' }
El punto final debe ser /house/1/us/ny?zipcode=12345 y luego req.query.zipcode tendrá el valor del código postal. ? en vez de &.
Cuando se usa /house/1/us/ny&zipcode=12345, req.params considera ny&zipcode=12345 como el valor para el estado clave. ? finaliza el punto final y comienza los parámetros de consulta.