User.findUserByEmail 不是函数

User.findUserByEmail is not a function

我正在使用 nodejs 和 mongoose,使用 express-validator 来验证电子邮件重复,

  check("email")
    .custom(value => {
        return User.findUserByEmail(value).then(user => {
        if (user) {
            return Promise.reject('E-mail already in use');
        }
        });
    })

当使用重复的电子邮件发帖时,我收到错误提示

{
  "errors": [
    {
      "value": "boka@gmail.com",
      "msg": "User.findUserByEmail is not a function",
      "param": "email",
      "location": "body"
    }
  ]
}

我使用参考作为 https://express-validator.github.io/docs/custom-validators-sanitizers.html#example-checking-if-e-mail-is-in-use

我尝试使用其他方法,例如 findOne

.custom(value => {
        return User.findOne({value}).then(user => {
        if (user) {
            return Promise.reject('E-mail already in use');
        }
        });
    })

它确实有效,但是,它 return 响应重复,即使电子邮件不重复但写入 db

{
  "errors": [
    {
      "value": "boka1@gmail.com",
      "msg": "E-mail already in use",
      "param": "email",
      "location": "body"
    }
  ]
}

有没有我遗漏的东西谢谢。

mongoose 中,在名为 findUserByEmail 的模型上没有这样的方法,这就是您收到该错误的原因。

您可以改用findOne。如果你坚持,我认为你应该在你的模型中自己定义它。

User.findUserByEmail = (email) => {
  return this.findOne({ email: email })
  // or return User.findOne({ email: email })
}
.custom((value, { req }) => {
    return new Promise((resolve, reject) => {
        User.findOne({ email: req.body.email }, function(err, user) {
            if (err) {
                reject(new Error("Server Error"));
            }
            if (Boolean(user)) {
                reject(new Error("E-mail already in use"));
            }
            resolve(true);
        });
    });
}),

检查这个...