首页 > 解决方案 > TypeError:无法读取未定义的属性“q1”

问题描述

我设计了我的猫鼬模式,里面有一组对象,就像这样。这是 User.js:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var UserSchema = new Schema({
   name:String,
   surname:String,
   questions: {
    q1:{statement:String, spoof:Boolean},
    q2:{statement:String, spoof:Boolean},
    q3:{statement:String, spoof:Boolean}
 },
 color:{
   red:Number,
   green:Number,
   blue:Number
 }
});

var User = mongoose.model("User", UserSchema);
module.exports = User;`

所以我想要三个问题,然后是三个看起来不错的数字。但是,当我需要此架构并引用 User.questions 时,它说它是未定义的,即使我已经在架构中定义了它?这是我处理表单中的 POST 数据并尝试将其保存到数据库的地方

app.post("/register", (req, res) => {

   User.firstname = req.body.firstname;
   User.surname = req.body.surname;
   User.questions.q1.statement = req.body.q1;
   User.questions.q1.spoof = strToBoolean(req.body.q1Spoof);
   User.questions.q2.statement = req.body.q2;
   User.questions.q2.spoof = strToBoolean(req.body.q2Spoof);
   User.questions.q3.statement = req.body.q3;
   User.questions.q3.spoof = strToBoolean(req.body.q3Spoof);
   User.color.red = 255;
   User.color.green = 255;
   User.color.blue = 255;
   User.save(err => console.log("Did not save to database: \n" + err));

});

strToBoolean 函数将字符串转换为布尔值 这应该很简单吧?但我还没有看到任何对我有帮助的答案。任何帮助表示赞赏。

标签: node.jsmongoosemongoose-schema

解决方案


User是一个模型。您需要基于此模型实例化一个文档并将您的变量分配给它:

app.post("/register", (req, res) => {

   let user = new User()
   user.firstname = req.body.firstname;
   user.surname = req.body.surname;
   user.questions.q1.statement = req.body.q1;
   user.questions.q1.spoof = strToBoolean(req.body.q1Spoof);
   user.questions.q2.statement = req.body.q2;
   user.questions.q2.spoof = strToBoolean(req.body.q2Spoof);
   user.questions.q3.statement = req.body.q3;
   user.questions.q3.spoof = strToBoolean(req.body.q3Spoof);
   user.color.red = 255;
   user.color.green = 255;
   user.color.blue = 255;
   user.save(err => console.log("Did not save to database: \n" + err));

});

我不确定 Mongoose 在不存在默认值时如何处理嵌套对象模式,因此您可能需要实例化 questions 对象和 each q1q2然后q3才能分配给它们:

   user.questions = {q1: {}, q2: {}, q3: {}};
   user.questions.q1.statement = req.body.q1;

您还可以通过将对象传递给构造函数来创建文档:

   let user = new User({
     firstname: req.body.firstname,
     surname: req.body.surname,
     questions: {
      q1: {
        statement: req.body.q1,
        spoof: strToBoolean(req.body.q1Spoof)
      },
      q2: {
        statement: req.body.q2,
        spoof: strToBoolean(req.body.q2Spoof)
      },
      q3: {
        statement: req.body.q3,
        spoof: strToBoolean(req.body.q3Spoof)
      }
    }
    color: {
      red: 255,
      green: 255,
      blue: 255
    }
   })
   user.save(err => console.log("Did not save to database: \n" + err));

推荐阅读