Soy nuevo en MERN. Quiero imprimir USUARIO YA EXISTE si el correo electrónico o el nombre ya están presentes. Usé el método .find pero no funciona. aqui esta el codigo
const { response } = require('express') const express = require('express') const router = express.Router() const mongoose = require('mongoose') const User = mongoose.model("User") 'defined in user.js' const bcrypt = require('bcryptjs') router.post('/signup',(req,res)=>{ const {name,email,password} = req.body if(!email || !password || !name){ return res.status(422).json({"error":"please add all the fields"}) //status 422 means server has understood the request but cant proess } User.find({email : email, name : name}).then((savedUser)=>{ if(savedUser){ return res.status(422).json({error:"user already exist."}) } bcrypt.hash(password,6).then(hashedpassword=>{ const user = new User({ email, //is also written as "email" : email password:hashedpassword, name }) user.save().then(user=>{ res.json({message:"saved sucessfully"}) }).catch(err=>{ console.log(err) }) }) / }).catch(err=>{ console.log(err) }) }) module.exports = router;El uso .find() en mongoose devuelve una matriz de documentos, incluso si hay un registro, estará dentro de una matriz. El problema es cuando ningún documento coincide con su consulta .find() devolverá una matriz vacía. haciendo que savedUser = [] y cuando lo verifique aquí if(savedUser) siempre devuelve verdadero, lo que da como resultado que el bloque a continuación se ejecute siempre
return res.status(422).json({error:"user already exist."})Puedes superar este problema usando:
if(savedUser.length) (comprobando que haya elementos en la matriz)..findOne en lugar de .find , que devolverá el primer documento que coincida con su consulta y null de lo contrario. Sugeriría usar .findOne