Home > other >  Unable to find user with Mongoose.findOne()
Unable to find user with Mongoose.findOne()

Time:11-28

I am using fetch() to call a url as follow:

  const context = useContext(AuthContext);
  const navigate = useNavigate();

  const handleSubmit = (event) => {
    event.preventDefault();
    const data = new FormData(event.currentTarget);
    // console.log({
    // email: data.get("email"),
    // password: data.get("password"),
    // });
    if (data) {
      //TODO: Trigger a mutation or update
      fetch("http://localhost:4000/api/user/login", {
        method: "POST",
        crossDomain: true,
        headers: {
          "Content-Type": "application/json",
          "Accept": "application/json",
          "Access-Control-Allow-Origin": "http://localhost:4000",
        },
        body: JSON.stringify({
          email: data.get("email"),
          password: data.get("password"),
        }),
      })
        .then((res) => res.json())
        .then((result) => {
          console.log(result);
          if (result.token) {
            context.login(result);
            navigate("/Home");
          }
        })
        .catch((e) => console.log(e));
    } else {
      console.log("Login failed.");
    }
  };

{handleSubmit} is then triggered upon clicking on submit button on the page.

The login controller:

const login = async (req, res, next) => {
  function generateToken(user) {
    return jwt.sign(
      {
        id: user.id,
        email: user.email,
        username: user.username,
      },
      SECRET_KEY,
      { expiresIn: "1h" }
    );
  }

  const user = await User.findOne({ email });
  if (!user) {
    console.log("User not found.");
  }

  const match = bcrypt.compare(password, user.password);
  if (!match) {
    console.log("Wrong password.");
  }

  const token = generateToken(user);

  return { token };
};

Right now the error thrown is "User not found". I don't understand why is there no user found as the user with the entered email address exists in my mongodb atlas.

Please provide some guidance. Cheers.

CodePudding user response:

You need to add the following code in your login controller .

const {email} = req.body.email; 
const user = await User.findOne({ email });

And i can see from your comment that when you are submitting the form you are getting nothing back ! I can see that you are returning the token . Instead you have to add the following code if everything goes well.

res.json({token: token})

Or

res.status(200).json({token})

If everything is fine then you will get a response like this:

{
 token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

One more thing to handle

if(!user) {
  //here you should use either of the following line 
  //next('No such user found')
  res.status(404).send('No user found with that email')
}
 if (!match) {
    //here you should use either of the following line 
  //next('Password Mismatch')
  res.status(400).send('Password Mismatch')
  }

Why is that ? Because if you don't handle this type of errors your app will not respond! Cause it will stuck in the middleware lifecycle !

CodePudding user response:

const login = async (req, res, next) => {
  try {
    function generateToken(user) {
      return jwt.sign(
        {
          id: user.id,
          email: user.email,
          username: user.username,
        },
        SECRET_KEY,
        { expiresIn: "1h" }
      );
    }
    const { email } = req.body.email
    const user = await User.findOne({ email });
    if (!user) {
      console.log("User not found.");
      res.status(404).json({ error: "User not found!" })
    } else {
      const match = bcrypt.compare(password, user.password);
      if (!match) {
        console.log("Wrong password.");
        res.status(401).json({ error: "Wrong Password!" })
      }
      if (match) {
        const token = generateToken(user);
        res.status(200).json({ token });
      }
    }
  } catch (error) {
    return res.status(500).json({ error: error.message });
  }
};
  • Related