Схема Mongoose "this" возвращает ключевое слово undefined - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть следующая схема, которая имеет два поля:

-finalGrade введен пользователем

-numericGrade получен из finalGrade

Проблема заключается в следующем: независимо от того, какиеЗначение из перечисления finalGrade, которое я ввожу, numericGrade всегда будет 164. Когда я пытался избежать значения this.finalGrade, я обнаружил, что оно всегда возвращает «undefined».

Как получить правильное значениевозвращаемое значение?

Заранее спасибо!

(Ссылка: https://mongoosejs.com/docs/defaults.html#default-functions-and-this)

РЕДАКТИРОВАНИЕ 2: вся схема обновлена ​​

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

РЕДАКТИРОВАТЬ: Добавлен код создания документа в соответствии с просьбой:

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 Ответ

0 голосов
/ 10 ноября 2019

По какой-то причине опция по умолчанию, кажется, не работает, когда вы создаете документ регистрации таким образом.

Но, кажется, это работает, когда вы используете конструктор форму.

Попробуйте так:

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');

  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...