2016-07-24 46 views
0

我写取数据,并将其存储到数据库的API,也对其进行编辑和删除它,添加/删除的作品很好,但是当我更新我想只能更新某些属性,并且如果用户不发送属性,我希望代码将数据保存在数据库中。相反,如果我不发送属性,它将被空数据覆盖。添加/编辑/删除API,用户更新数据将覆盖在DB数据的NodeJS快递猫鼬

下面是一个例子:

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

这种方法是从你在做什么,但我想这种方式推荐给你一点不同,这样就可以让您的文档模型在一个地方通话他们只要你需要他们。验证部分可以使用单独的模块来处理。

要更新它的方式要求被指派其他变量,因为它是,像我取使用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 { 
} 
}); 
+0

猫鼬将不会触发它是在模型验证,如果您使用此方法,请确保你在这种情况下,手动验证。 – Paul

+0

@Paul我使用一个额外的模块来解决验证问题,并在定义模式时使用它。那有什么问题?不值得赞扬,是吗?! –

+0

这是值得您的解决方案的主要文本,他目前的做法会(即使用'.save()''副findOneAndUpdate()')你所建议的解决方案不包括行为这方面提。我没有因为使用额外的模块而失望;您在解决方案中没有提及它。 – Paul

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'...这很好保持,但你不能像我一样,分离出老师查询。

我这样做的好处是,只要你想先找到一个东西(例如看老师,删除老师等),你就有这样的逻辑,在一个地方这样做,而不是必须在其他处理程序中重复。