我在使用Mongoose从查找中更新文档时遇到问题。问题是当我尝试用对象覆盖文档时(例如doc = req.body)。但是,我可以直接将原始文档的属性设置为特定字符串(例如doc.name ='jason borne';)。
我已经确认res.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);
});
});
尝试将doc设置为对象时,收到错误:
TypeError:Object#没有方法'save'
我知道我可以使用简单的Client.update(...)命令进行更新,但是此方法不允许我的架构中间件或验证运行(在Mongoose documentation中有注释) )。
有什么想法?我是Node和Mongoose的新手。
答案 0 :(得分:2)
你现在得到的症状是由于你正在用你的身体解析的一个简单的json对象替换一个mogoose模型对象(使用save,find等方法),这个对象遗漏了{{ 1}}。
尝试更新而不是查找/保存。
save
或者尝试将 Client.update({_id: req.params.client_id}, {$set : req.body}, function(err) {...});
合并到req.body
对象。
答案 1 :(得分:2)
您需要使用下划线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);
});
});