skip to Main Content

So I am trying to create a basic authentication app without using any modules or auth strategies. Just by pushing user credentials to a MongoDb database and then by comparing the entered credentials every time a user tries to login with the existing ones.

text

For some reason i am not able to filter out the mongodb document with the same username entered by the user. When i try to log it to the console i am getting a query , i am expecting an object so that both the req.body.password and user.password can be compared.

2

Answers


  1. The User.findOne function returns a Query object, which represents the pending query operation. To retrieve the actual user document, you need to execute the query using .exec().

    You can modify your function in this way:

    app.post("/api/v1/login", (req, res) => {
      User.findOne({ username: req.body.username })
        .exec()
        .then((user) => {
          console.log(req.body.username);
          console.log(user);
          if (user) {
            const result = req.body.password === user.password;
            if (result) {
              res.redirect("/api/v1/dashboard");
            } else {
              res.status(404).json({ error: "entered password doesn't match" });
            }
          } else {
            res.redirect("/api/v1/register");
          }
        })
        .catch((error) => {
          console.log(error);
          res.status(500).json({ error: "An error occurred" });
        });
    });
    

    Let me know, If still the issue persist.

    Login or Signup to reply.
  2. Mongoose’s findOne returns a Query, which you need to execute to get a Promise containing the actual object. If you change the relevant lines to the following, you should be fine:

    app.post("/api/v1/login", async (req, res) => {
      var user = await User.findOne({ username: req.body.username }).exec();
      ...
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search