0

I want to insert new data into a collection, but when I submit the form, I get a validation error.

ValidationError: Teacher validation failed: subject: Please enter subject, second_subject: Path second_subject is required.

HTML File

<form action="/register" method="post" id="form3">
    <div class="form-group"><label class="small mb-1">Full name</label><input class="form-control py-4" style="width: 50%;" type="name" name="name" placeholder="Enter full name" /></div>
    <div class="form-group"><label class="small mb-1" >Email</label><input class="form-control py-4" style="width: 50%;" type="username"  name="username" placeholder="Enter email address" /></div>
    <div class="form-group"><label class="small mb-1" >Password</label><input class="form-control py-4" style="width: 50%;" type="password"  name="password" placeholder="Password" /></div>
    <input type="hidden" id="roles" name="roles" value="Creator">
    <div class="form-group"><label class="small mb-1" >Select Primary Subject</label>
        <select name="subject" class="form-control" style="width: 30%;" id="subject">
            <option value="">-- Select Subject --</option>
            <% subject.forEach(function (subject) { %>
            <option value= "" ><%= subject.subject_name %></option>
            <% }) %>
        </select>
    </div>
    <div class="form-group"><label class="small mb-1" >Select Secondary Subject</label>
        <select name="secondary_subject" class="form-control" style="width: 30%;" id="secondary_subject">
            <option value="">-- Select Subject --</option>
            <% subject.forEach(function (subject) { %>
            <option value= "" ><%= subject.subject_name %></option>
            <% }) %>
        </select>
    </div>
    <div class="form-group"><label class="small mb-1" >Preferred Level of study</label>
        <select name="level" class="form-control" style="width: 30%;" id="level">
            <option value="">-- Select level --</option>
            <option value="Level 1">Level 1</option>
            <option value="Level 2">Level 2</option>
        </select>
    </div>
    <div class="form-group mt-4 mb-0"><input type="submit" value="Submit" style="width: 20%;" a class="btn btn-primary btn-block" href="/admin_user"></div>           
</form>

Route

if(req.body.subject && req.body.secondary_subject,req.body.level){
    var teacherData = {
        subject: req.body.subject,
        second_subject: req.body.secondary_subject,
        level: req.body.level,
        userId:req.session.userId,
    }
    Teacher.create(teacherData, function (err, teacher){
        if(err){
            return next(err)
        }else
        {
            console.log('Teacher details added'+teacher)
            return res.redirect('/admin_user');
        }
    });
}else{
    var err = new Error('All fields have to be filled out');
    err.status = 400;
    return next(err);
}

Schema

var TeacherSchema = new mongoose.Schema ({

    subject: {
        type:String,
        required:true,
    },

    level: {
        type:String,
        required:true,
    },


    second_subject: {
        type:String,
        required:true,
    },

    userId:{
        type:String,
        required:true,
    },

});

3
  • Do you really send secondary_subject in req.body? Can you check by console.log(req.body)? Commented Jun 12, 2020 at 17:34
  • this is result { name: 'dsad', username: 'sadsad', password: 'sdas', roles: 'Creator', subject: '', secondary_subject: '', level: 'Level 1' } Commented Jun 12, 2020 at 17:38
  • So you send empty seconday_subject, that's why you get the validation error. Check if you are really choosing some value in the form. Commented Jun 12, 2020 at 17:51

1 Answer 1

1

In your Route file, check for both "not null" and "not equal to empty string". This would ensure that empty strings are not entered to your database.

if (req.body.subject != null && req.body.subject !== "" && req.body.secondary_subject != null && req.body.secondary_subject !== "" && req.body.level != null && req.body.level !== "") {
  var teacherData = {
    subject: req.body.subject,
    second_subject: req.body.secondary_subject,
    level: req.body.level,
    userId: req.session.userId,
  }
  Teacher.create(teacherData, function(err, teacher) {
    if (err) {
      return next(err)
    } else {
      console.log('Teacher details added' + teacher)
      return res.redirect('/admin_user');
    }
  });
} else {
  var err = new Error('All fields have to be filled out');
  err.status = 400;
  return next(err);
}

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.