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>
);
}
2
Answers
The object you pass to mongoose does not contain a field called
mail
instead you pass it asemail
. So you need to map theemail
field from your request payload tomail
:The other thing you need to fix is your client side. You’re sending form-data instead of a json-body. Change it to:
Make sure you’re getting values out of
req.body
. It seems to me that might be it. Try to log the values ofreq.body
in your signup controller. Newer versions of Expressjs don’t use the bodyParser middleware anymore, instead you’d useapp.use(express.urlencoded())
andapp.use(express.json())
. Can’t comment on your post yet, so that’s why this answer might be kinda a suggestion.