Mongoose Schema报错:Cannot read property 'q1' of undefined 求助
问题分析与解决方案
嘿,这个问题的核心原因很明确:你直接在Mongoose的User模型上进行属性赋值,而不是先创建模型的实例!Mongoose模型是用来生成文档对象的构造函数,只有实例化之后,嵌套的questions和color属性才会被初始化,直接操作模型本身自然会出现Cannot read property 'q1' of undefined的错误。
另外注意一下,你的Schema里定义的是name字段,但处理请求时写的是User.firstname,这也会导致数据无法正确映射,我会在修正代码里一起调整。
修正方案1:先创建实例,再赋值保存
app.post("/register", (req, res) => { // 1. 创建User模型的实例 const newUser = new User(); // 2. 给实例的属性赋值(注意Schema里是name不是firstname) newUser.name = req.body.firstname; newUser.surname = req.body.surname; // 3. 给嵌套的questions属性赋值 newUser.questions.q1.statement = req.body.q1; newUser.questions.q1.spoof = strToBoolean(req.body.q1Spoof); newUser.questions.q2.statement = req.body.q2; newUser.questions.q2.spoof = strToBoolean(req.body.q2Spoof); newUser.questions.q3.statement = req.body.q3; newUser.questions.q3.spoof = strToBoolean(req.body.q3Spoof); // 4. 给嵌套的color属性赋值 newUser.color.red = 255; newUser.color.green = 255; newUser.color.blue = 255; // 5. 调用实例的save方法保存到数据库 newUser.save((err) => { if (err) { console.log("Did not save to database: \n" + err); return res.status(500).send("保存失败"); } console.log("用户保存成功"); res.status(200).send("注册成功"); }); });
修正方案2:使用User.create()一步到位(更简洁)
User.create()会直接创建实例并保存,不需要手动调用save(),代码更简洁:
app.post("/register", (req, res) => { // 直接构造要保存的数据对象,包括嵌套属性 const userData = { name: 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 } }; // 使用create方法创建并保存 User.create(userData, (err, savedUser) => { if (err) { console.log("Did not save to database: \n" + err); return res.status(500).send("保存失败"); } console.log("用户保存成功", savedUser); res.status(200).send("注册成功"); }); });
额外提示
- 永远记住:Mongoose模型是构造函数,用来生成具体的文档实例;只有实例才拥有Schema定义的所有属性(包括嵌套对象)。
- 处理数据库操作时,记得在回调里处理错误和响应客户端,避免用户一直等待。
内容的提问来源于stack exchange,提问作者unkwndev
相关产品推荐
相关产品推荐

