User.findUserByEmail is not a function

Viewed 354

I'm using nodejs and mongoose , using express-validator to validating email duplicate,

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

and when posting with duplicated email i've got error saying

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

I've used reference as https://express-validator.github.io/docs/custom-validators-sanitizers.html#example-checking-if-e-mail-is-in-use

I tried to use other method such as findOne

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

It does works but , It return response as duplicate even if email is not duplicate but writes to db

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

Is there something i'm missing thank you.

2 Answers

In mongoose, there is no such method on models called findUserByEmail that's why you are getting that error.

You can use findOne instead. If you insist, I think you should define it yourself in your model.

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

check this ...

Related