这是用户架构,我要更新的部分是User.js下的ToDo(进一步)。
data.js
app.post("/data", loggedIn, async (req, res) => {
console.log(req.body.content);
let content = { content: req.body.content };
User.update({ _id: req.user._id }, { $set: req.body }, function (err, user) {
if (err) console.log(err);
if (!content) {
req.flash("error", "One or more fields are empty");
return res.redirect("/");
}
user.ToDo.push(content);
res.redirect("/main");
});
});
User.js
new mongoose.Schema({
email: String,
passwordHash: String,
ToDo: {
type: [],
},
date: {
type: Date,
default: Date.now,
},
})
我得到了错误:
user.ToDo.push(content); ^
TypeError:无法读取未定义的属性“ push”
答案 0 :(得分:2)
首先,您的问题是回调不是用户。当您使用update
时,回调是这样的:
{ n: 1, nModified: 1, ok: 1 }
这就是引发错误的原因。
我还建议指定数组值,如下所示:
ToDo: {
type: [String],
}
第二个建议是尽一切可能对mongo
查询。如果可以使用查询来推送对象,请执行此操作,而不是将对象存储到内存中,push
使用JS函数并将对象再次保存到DB中。
当然可以,但是我认为更糟。
现在,知道了这一点,如果您只想将值添加到数组中,请尝试以下查询:
var update = await model.updateOne({
"email": "email"
},
{
"$push": {
"ToDo": "new value"
}
})
检查示例here
您正在对对象使用$set
,因此您正在创建具有新值的新对象。
检查here $set
的工作方式。
如果不存在的字段将被添加,否则将被更新。如果只想将元素从指定字段添加到数组中,则应$push
到该字段中。
在您的代码之后,也许您想做类似的事情:
model.findOne({ "email": "email" }, async function (err, user) {
//Here, user is the object user
user.ToDo.push("value")
user.save()
})
就像我之前说的那样,这行得通,但是在查询中更好。