在转换Mongoose对象时出现“toObject is not a function”错误

3
我有一个路由'/login',它有一个控制器来验证用户是否有效。目前,我只是验证从路由参数输入的密码是否等于我在数据库中存储的密码。
我有几种方法可以帮助我完成这项工作。 1. findUser() - 验证用户是否输入了必填字段,并在找到数据时解析Mongoose对象。 2. ValidatePassword() - 它链接到findUser()并将mongoose对象转换为JS对象。
在validatePassword方法中,我想删除不需要的字段(如密码)然后再将数据发送给客户端。因此,我将mongoose对象转换为javascript对象并执行删除操作。
问题:每当我将其转换为JS对象时,都会出现“toObject()未定义”的错误。附上上述控制器方法的片段。请建议任何更改!
 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);
      }
    });
  };

这个方法检索用户详细信息,我将其链接在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);
      }
    });
  }

链接:
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);
    });
};
2个回答

4
看起来你正在使用模型的 .find 方法而不是 .findOne 方法。第一个方法将始终返回与查询匹配的文档数组,而第二个方法将返回匹配的第一个对象。你基本上正在尝试执行 [{something}].toObject(),这确实是未定义的。

1

使用findOne而不是find,因为.toObject适用于单个对象,而不是数组。

如果您想在数组上运行.toObject,只需循环该数组并在循环中对数组的单个对象运行.toObject


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接