以下是使用express.js和mongoose的更新方法的代码段。 我试图将现有的mongo实体与请求有效负载主体中的json对象合并。
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
Entity.findById(req.params.id, function (err, entity) {
if (err) { return handleError(res, err); }
if(!entity) { return res.send(404); }
var updated = _.merge(entity, req.body);
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, entity);
});
});
};
遗憾的是,这并不奏效。我收到此错误
node_modules/mongoose/lib/document.js:1272
doc.save(handleSave);
^
TypeError: Object #<Object> has no method 'save'
我尝试创建自己的自定义merge
方法,但仍然无法实现正确的合并:
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
Entity.findById(req.params.id, function (err, entity) {
if (err) { return handleError(res, err); }
if(!entity) { return res.send(404); }
var updated = merger(resume, req.body)//_.merge(resume, req.body);
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, entity);
});
});
};
function merger (a, b) {
if (_.isObject(a)) {
return _.merge({}, a, b, merger);
} else {
return a;
}
};
有了这种差异,我有这样的信息:
node_modules/mongoose/lib/document.js:1245
return self.getValue(i);
^
TypeError: Object #<Object> has no method 'getValue'
因此,我无法将entity
和req.body
的值扩展到目标updated
。我想只有结构被复制了。有人请告诉我错误的地方。感谢。
答案 0 :(得分:10)
我可以通过将_.merge
更改为_.extend
来解决此问题,然后直接在findById
而不是变量updated
返回的结果上调用保存。
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
Entity.findById(req.params.id, function (err, entity) {
if (err) { return handleError(res, err); }
if(!entity) { return res.send(404); }
_.extend(entity, req.body);
entity.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, entity);
});
});
};