最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - toObject is not a function error while converting mongoose object - Stack Overflow

programmeradmin1浏览0评论

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);
    });
};

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);
    });
};
Share Improve this question asked Jul 4, 2020 at 10:46 kalyan veenamkalyan veenam 931 gold badge2 silver badges10 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 4

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.

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.

发布评论

评论列表(0)

  1. 暂无评论