Mongoose 模式“this"关键字返回未定义 [英] Mongoose schema "this" keyword returns undefined

查看:50
本文介绍了Mongoose 模式“this"关键字返回未定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下架构,其中包含两个字段:

I have the following schema which has two fields:

-finalGrade 由用户输入

-finalGrade is entered by user

-numericGrade 派生自 finalGrade

-numericGrade is derived from finalGrade

问题是:无论我从 finalGrade 的枚举中输入哪个值,numericGrade 始终是 164.当我试图转义 this.finalGrade 的值时,我发现它总是返回undefined".

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?

提前致谢!

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

编辑 2:更新了整个架构

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

按要求添加文档创建代码:

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

   })
}

推荐答案

由于某些原因,当您像这样创建注册文档时,默认选项似乎不起作用.

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.

试试这个:

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

  })
}

这篇关于Mongoose 模式“this"关键字返回未定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆