Home > Mobile >  How to fix 'validation failed error' during a sign up in MongoDb / NodeJs Express app
How to fix 'validation failed error' during a sign up in MongoDb / NodeJs Express app

Time:06-21

I am trying to save a user to mongodb database using post request as follow, but I got the error :
"Error: User validation failed: mail: Path `mail` is required., pseudo: Path `pseudo` is required., password: Path `password` is required."

PS : I edited in response to Eol but my question / and the bug are still present.

Details error :

 errors: {
    mail: ValidatorError: Path `mail` is required.
       [...] {
      properties: [Object],
      kind: 'required',
      path: 'mail',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },

my controller :

exports.signup = (req, res, next) => {
      const user = new User({
        mail: req.body.mail,
        password: req.body.password,
        pseudo: req.body.pseudo,
      });
      user
        .save()
        .then(() => res.statuts(201).json({ message: "User created !" }))
        .catch(err => console.log(err) )
    }

My User Model :

const mongoose = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator"); 

const userSchema = mongoose.Schema({
  pseudo: { type: String, required: true, unique: true },
  mail: { type: String, required: true, unique: true },
  password: { type: String, required: true },
});

userSchema.plugin(uniqueValidator); 

module.exports = mongoose.model("User", userSchema);

My front :

 const handleSubmit = (e) => {
    e.preventDefault()
    const pseudo = e.target[0].value, 
    password = e.target[1].value, 
    mail = e.target[2].value 
    const data = new FormData()
    data.set("pseudo", pseudo)
    data.set("password", password)
    data.set("mail", mail)

    axios.post(url, data)
    .then(res => console.log(res))
    .catch(res => console.log(res))
  };

  return (
      <div>
        <form onSubmit={handleSubmit}>
          <div >
            <label htmlFor="pseudo">Pseudo</label>
            <input name="pseudo" type="text" id="pseudo"/>
          </div>
          <div>
            <label htmlFor="password">password</label>
            <input name="password" type="password" id="password" autoComplete="true"/>
          </div>
          <div>
            <label htmlFor="mail">email</label>
            <input name="mail" type="email" id="mail"/>
          </div>
          <input
            type="submit"
            to="/user"
            value="Sign up"
          />
        </form>
      </div>
  );
}

CodePudding user response:

The object you pass to mongoose does not contain a field called mail instead you pass it as email. So you need to map the email field from your request payload to mail:

const user = new User({
        mail: req.body.email,
        password: req.body.password,
        pseudo: req.body.pseudo,
 });

CodePudding user response:

Make sure you're getting values out of req.body. It seems to me that might be it. Try to log the values of req.body in your signup controller. Newer versions of Expressjs don't use the bodyParser middleware anymore, instead you'd use app.use(express.urlencoded()) and app.use(express.json()). Can't comment on your post yet, so that's why this answer might be kinda a suggestion.

  • Related