添加/编辑/删除api,用户更新数据覆盖DB nodejs表示mongoose中的数据

时间:2016-07-24 09:21:29

标签: node.js mongodb express

我正在编写一个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"});
        }
    });

}
 });
 });

2 个答案:

答案 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'...这样的话很好,但是你不能像我一样分开教师的查询。

我这样做的好处是,无论何时你想首先找到一个东西(例如,查看老师,删除老师等),你都有在一个地方这样做的逻辑,并且不要这样做。必须在其他处理程序中重复它。