在find中更新文档

我在使用Mongoose查找内容时遇到问题。 这个问题只是当我试图用一个对象覆盖文档(例如doc = req.body)。 但是我可以直接将原始文档的属性设置为特定的string(例如doc.name ='jason borne';)。

我已经validationres.body是一个对象,所以我不明白为什么我不能这样设置它。

Client.findById(req.params.client_id, function (err, client) { if (err) return next(new restify.InternalError(err)); // client.name = 'jason borne'; client = req.body; client.save(function(err) { if (err) return next(new restify.InternalError(err)); res.send(client); }); }); 

当试图将文档设置为对象时,我收到错误:

TypeError:对象#没有方法“保存”

我知道我可以使用一个简单的Client.update(…)命令进行更新,但是这种方法不允许我的模式中间件或validation运行(这在Mongoose文档中有记载 )。

有什么想法吗? 我是Node和Mongoose的新手。

您需要使用下划线的extend方法之类的东西来将req.body的属性复制到client对象中,而不是像现在一样将client重新指向req.body

 var _ = require('underscore'); Client.findById(req.params.client_id, function (err, client) { if (err) return next(new restify.InternalError(err)); _.extend(client, req.body); client.save(function(err) { if (err) return next(new restify.InternalError(err)); res.send(client); }); }); 

你现在正在得到的症状是由于你正在用一个简单的json对象来replace一个mogoose模型对象(像保存,查找等方法),这是从你的身体parsing出来的,这是缺lesssave

尝试做一个更新,而不是查找/保存。

  Client.update({_id: req.params.client_id}, {$set : req.body}, function(err) {...}); 

或者尝试将你的req.body合并到client对象。