1

I have the following schema which has two fields:

-finalGrade is entered by user

-numericGrade is derived from finalGrade

The problem is: No matter which value from the finalGrade's enum I enter, the numericGrade will always be 164. As I tried to escape the value of this.finalGrade, I found out that it always return "undefined".

How do I get the correct value returned?

Thanks in advance!

(Referenced: https://mongoosejs.com/docs/defaults.html#default-functions-and-this )

EDIT 2: entirety of Schema updated

const mongoose = require('mongoose');

const Student = mongoose.model('Student');
const Course = mongoose.model('Course');

let enrolmentSchema = new mongoose.Schema({

        student: {
            type: Number, 
            min: 1000000000, 
            max: 9999999999, 
            required: [true, "missing studentID"],
            validate:{
                isAsync: true,
                validator: function(v, cb){
                    Student.find({studentID: v}, function(err,docs){
                        cb(docs.length != 0);
                    })
                },
                message: 'Student does not exist...'
            }

        },
        course: {type: String, minlength: 3, maxlength: 3, required: [true, "missing courseID"]},
        semester:{
            type: Number, 
            validate:
            {
                validator: function(v){
                    return Number.isInteger(v) && v>= 1 && v<= 8;
                },
            message: "semester must be an integral value from [1 to 8]"
            }
        },
        finalGrade: {
            type: String,
            enum: ['E', 'G', 'P', 'F', '']
        },

        numericGrade:{
            type: Number,
            default: function()
            {
                console.log(escape("This is finalGrade:" +this.finalGrade)); //debugging
                if(this.finalGrade==='E'){
                    return 5;
                }
                else if(this.finalGrade==='G'){
                    return 4;
                }
                else if(this.finalGrade==='P'){
                    return 3;
                }
                else if(this.finalGrade==='F'){
                    return 2;
                }
                else if(this.finalGrade===''){
                    return 1;
                }
                else return 164;
            }
        }

})
mongoose.model('Enrolment', enrolmentSchema);

EDIT: Added document creation code as requested:

function insertEnrolmentRecord(req,res){
    var enrolment = new Enrolment();
    enrolment.student = req.body.student;
    enrolment.course = req.body.course;
    enrolment.semester= req.body.semester;
    enrolment.finalGrade= req.body.finalGrade;
    enrolment.save((err,doc)=>{
        if(err) {
            console.log(err);
            res.redirect('/enrolment/add_failed')
        }
        else res.redirect('/enrolment');

   })
}

1 Answers1

0

For some reason default option seems not to work, when you create your enrolment document like that.

But it seems to work when you use the constructor form.

Try like this:

function insertEnrolmentRecord(req, res) {

  const { student, course, semester, finalGrade } = req.body;

  let enrolment = new Enrolment({ student, course, semester, finalGrade });

  console.log(enrolment.numericGrade); // even here it will work

  enrolment.save((err, doc) => {
    if (err) {
      console.log(err);
      res.redirect('/enrolment/add_failed')
    }
    else res.redirect('/enrolment');

  })
}
SuleymanSah
  • 17,153
  • 5
  • 33
  • 54