我正在编写一个API来获取数据并将其存储到数据库中,也编辑它并删除它,添加/删除工作正常,但是当我更新时我希望能够仅更新某些属性,并且如果用户不发送属性我希望代码保持数据已存在于DB中。相反,如果我不发送属性,它将被空数据覆盖。
以下是一个例子:
router.post('/update', function (req, res) {
var first_name = req.body.first_name,
last_name = req.body.last_name,
email = req.body.email,
phone_number = req.body.phone_number,
clas = req.body.clas,
subject = req.body.subject,
teacher_id = req.body.teacher_id;
req.assert('teacher_id', 'Invalid teacher_id').notEmpty();
var errors = req.validationErrors();
if (errors) {
res.json(400, {success: false, message: "please enter your teacher_id "});
return;
}
Teacher.findOne({_id: teacher_id}, function (err, teacher) {
if (err) {
console.log(err);
} else {
teacher.first_name = first_name != null || first_name
!= undefined ? first_name : teacher.first_name;
teacher.last_name = last_name != null || last_name
!= undefined ? last_name : teacher.last_name;
teacher.email = email != null || email
!= undefined ? email : teacher.email;
teacher.phone_number = phone_number != null || phone_number
!= undefined ? phone_number : teacher.pickup_points;
teacher.clas = clas != null || clas
!= undefined ? clas : teacher.clas;
teacher.subject = subject != null && subject
!= undefined ? subject : teacher.subject;
teacher.save(function (err, teacher) {
if (err) {
console.log(err);
} else {
res.json({success: true, message: "teacher successfully updated"});
}
});
}
});
});
答案 0 :(得分:0)
这种方法与您的工作略有不同,但我建议您这样做,以便您可以将文档模型保存在一个位置,并在需要时随时调用它们。可以使用用于猫鼬的单独模块来处理验证部分。
您更新它的方式需要按原样分配其他变量,就像我使用findone
然后objectname.value
= newobjectname.value
解决此问题的一种简单方法是使用findoneandupdate
。
modelname.findOneAndUpdate({
primarykey: primarykey
}, {
$set: {
nameindocument: valuetobereplace
//you can add here values that you would like to change
}
}, {
new: true //new:true here helps to get updated object in return
}, function(err, doc) {
if (err) {
console.error("Error:" + err);
} else {
}
});
答案 1 :(得分:0)
这可能不是唯一的方法,但我使用Lodash库来使这种事情变得简单。我也使用' param'使用我的对象填充请求的路由,以便我保存回调。
const _= require("lodash ")
router.param("teacherId", function(id, req,res,next){
Teacher.findOne({_id : id}, function(e, teacher){
//add error handling of your choice
req.teacher = teacher;
next();
})
})
router.put("teacher/:teacherId", function(req,res){
var updates = _.pick(req.body, ["name","age"]; // whitelist allowed attribute names to change
var teacher = _.merge(req.teacher, updates);
teacher.save(function(e){
// handle your response.
})
})
/ *编辑* /
另外,请注意,在此解决方案中,我假设使用(合理标准的)REST格式的路由。如果你想继续使用router.post('/update'...
这样的话很好,但是你不能像我一样分开教师的查询。
我这样做的好处是,无论何时你想首先找到一个东西(例如,查看老师,删除老师等),你都有在一个地方这样做的逻辑,并且不要这样做。必须在其他处理程序中重复它。