Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

toObject is not a function error while converting mongoose object

I have a route '/login' which has controller to verify user is valid. For now, i am just verifying password entered from route params equals to password i stored in my DB.

I have few methods to get job done for me.

  1. findUser() - verifies user entered mandatory fields or not and resolves Mongoose object when data is found
  2. ValidatePassword() - It is chained to findUser() and converts mongoose object to JS object

In validatePassword method, i want to delete unwanted fields like password before sending data to client. As a result i am converting mongoose object to javascript object and performing delete operation.

Problem: Whenever i am converting in to JS object, i am getting 'toObject() not defined' error. Attaching snippets for above controller methods. Please suggest any changes!

 let findUser = (req, res) => {
    return new Promise((resolve, reject) => {
      if (req.body.email) {
        userModel.find({ email: req.body.email }, (error, userDetails) => {
          if (error) {
            let response = apiResponse.generate(
              true,
              "Unable to reach out to server",
              500,
              null
            );
            reject(response);
          } else if (checkLib.isEmpty(userDetails)) {
            let response = apiResponse.generate(
              true,
              "Unable to reach out to server",
              500,
              null
            );
            reject(response);
          } else {
            resolve(userDetails);
          }
        });
      } else {
        let response = apiResponse.generate(
          true,
          "Please provide emailID and password",
          404,
          null
        );
        reject(response);
      }
    });
  };

This method retrieves userDetails which i am chaining in validatePassword()

let validatePassword = (retrievedUserDetails) => {
    return new Promise((resolve, reject) => {
      console.log("passw:" + retrievedUserDetails);

      if (req.body.password) {
        console.log(retrievedUserDetails.password);
        console.log(req.body.password);
        if (retrievedUserDetails[0].password != req.body.password) {
          let response = apiResponse.generate(
            true,
            "Password or email is invalid",
            404,
            null
          );
          reject(response);
        } else {
          let retrievedUserDetailsObj = retrievedUserDetails.toObject();
          delete retrievedUserDetailsObj.password;
          let response = apiResponse.generate(
            false,
            "Signed in successfully",
            200,
            retrievedUserDetails
          );
          resolve(response);
        }
      } else {
        let response = apiResponse.generate(
          true,
          "Please provide password",
          404,
          null
        );
        reject(response);
      }
    });
  }

Chaining:

findUser(req, res)
    .then(validatePassword)
    .then((resolve) => {
      let response = apiResponse.generate(
        false,
        "user is signed in successfully",
        200,
        resolve
      );
      res.send(response);
    })
    .catch((err) => {
      console.log(err);
      res.send(err);
    });
};
like image 688
kalyan veenam Avatar asked Aug 11 '26 02:08

kalyan veenam


2 Answers

It seems you're using the .find method of the model and not the .findOne method. The first one will always return an array of documents that match the query while the second one will return the first object that matches. What you're basically trying to do is [{something}].toObject() and that is indeed undefined.

like image 161
Michael Ostrovsky Avatar answered Aug 12 '26 18:08

Michael Ostrovsky


Use findOne, instead of find because .toObject works on a single object, not an array.

If you want to run .toObject on the array, just loop the array and run .toObject on single object of the array in the loop.

like image 22
Swaraj Singh Avatar answered Aug 12 '26 18:08

Swaraj Singh