Estoy tratando de encontrar usuarios en la base de datos en función de cualquiera de los tres campos. en cartero tengo los siguientes caminos
http://localhost:8082/api/users/617473029f80eda3643a7fdd
http://localhost:8082/api/users/Michael
http://localhost:8082/api/users/25
actualmente en mi base de datos tengo todos esos valores para diferentes usuarios. Entonces, la idea es que la ruta 1 devuelva al usuario con esa identificación, la ruta 2 devuelva al usuario con ese nombre y la ruta 3 al usuario con esa edad. Para tu información: estoy probando esto, por lo que a partir de ahora esos valores de campo son únicos y no hay repeticiones en los campos de la base de datos.
con el siguiente código, lo único que regresa es cuando paso el id, pero regresa toda la base de datos. Nada vuelve cuando paso en nombre o edad
router.get('/:id', (req, res) => { User.find( { $or: [ {"_id": req.params.id}, {"name": req.params.name}, {"age": req.params.age} ]}) .then(user => res.json(user)) .catch(err => res.status(404).json({nouserfound: '***NoUserFound***'})) });¡Gracias!
EDITAR: Lo siguiente funcionó para mí
router.get('/:id', (req, res) => { User.find({$or: [ {name: req.params.id}, {age: req.params.id} ]}) .then(user => res.json(user)) .catch(err => res.status(404).json({nouserfound: '*** No User Found ***'})); });El único problema es que no detecta el error, por lo que al probar en cartero cualquier cosa que envíe que no coincida, solo devuelve una matriz vacía en lugar del error. No estoy seguro de cómo afectará esto al programa en sí o si está bien
req.params.name o req.params.age no estarán definidos porque el parámetro de ruta es req.params.id . Para que funcione correctamente, deberá buscar el valor solo por este parámetro de ruta. Los nombres de los campos cambian, pero el valor - req.params.id sigue siendo el mismo.
User.find( { $or: [ {"_id": req.params.id}, {"name": req.params.id}, {"age": req.params.id} ]}) .then(user => res.json(user)) .catch(err => res.status(404).json({nouserfound: '***NoUserFound***'})) Opcionalmente: para uso futuro, cambiar el nombre de id a slug sería una mejor opción, ya que esto va bien con todos los demás campos en su esquema.
Así es como mongodb devuelve los resultados cuando pasa undefined/null que trata como find({}) .
Debe verificar si existe el name / age . Estoy bastante seguro de que esta ruta no usará nombre/edad, sino que solo usa _id , entonces, ¿por qué no solo pasa _id ?
router.get('/:id', (req, res) => { // check what is available in req.params - name/age/id // based on it create query and run it User.find({"_id": req.params.id}) .then(user => res.json(user)) .catch(err => res.status(404).json({nouserfound: '***NoUserFound***'})) });Deberías revisar este enlace.
No puede establecer nombres diferentes para cada parámetro de solicitud, por lo que req.params.id debe ser solo una identificación y no estará disponible a través del nombre req.params.name
Intente enviar la solicitud archivada a través de parámetros de consulta, podría hacerlo más fácil. Mantendría el punto final :id , solo una forma común de solicitar un usuario por identificación, y crearía otro punto final para todas las demás solicitudes.