Tengo 2 funciones GET en el mismo archivo.
uno para dogid y el otro para dogname.
//Operations for api/dogs/{dogId} route //get operation router.get('/:dogId', async (req,res)=>{ try{ const dog = await Dogs.findById(req.params.dogId); res.json(dog); }catch(error){ res.json({message:error}); } })Y
//Operations for api/dogs/{dogName} route //get operation router.get('/:dogName', async (req,res)=>{ try{ const dog = await Dogs.find({'name': { $in: req.params.dogName}}) res.json(dog); }catch(error){ res.json({message:error}); } })Cuando intento npm start no da ningún problema.
Pero en Postman cuando envío la operación GET para http://localhost:3000/api/dogs/Sasha
entonces muestra lo siguiente:
{ "message": { "stringValue": "\"Sasha\"", "valueType": "string", "kind": "ObjectId", "value": "Sasha", "path": "_id", "reason": {}, "name": "CastError", "message": "Cast to ObjectId failed for value \"Sasha\" (type string) at path \"_id\" for model \"Doggies\"" } }El código para obtener los datos con dogname ya está presente. Pero dado que la función get para la ruta dogid se escribe antes que la ruta dogname, muestra este error.
El problema es que GET api/dogs/:dogId está manejando la solicitud ya que está escrita antes de GET api/dogs/:dogname.
Para resolver este problema, intente cambiar el diseño de su API o use diferentes métodos de solicitud HTTP. Por ejemplo :
POST api/dogs/:dogId GET api/dogs/:dogName or GET api/animals/dogs/:dogId GET api/dogs/:dogNamePero no hagas esto:
GET api/dogs/:dogId GET api/dogs/:dogNameComo @Mohammad Ismail ya señaló, debe usar un método HTTP diferente para diferenciar entre 2 rutas.
Hay otro enfoque que consiste en utilizar query en lugar de param
Envías la solicitud como localhost:3000/api/dog?dogName=abc
Luego, en su código: req.query.dogName obtendrá el valor abc