Lodash与猫鼬合并

时间:2014-08-22 13:35:33

标签: javascript node.js express mongoose lodash

以下是使用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'

因此,我无法将entityreq.body的值扩展到目标updated。我想只有结构被复制了。有人请告诉我错误的地方。感谢。

1 个答案:

答案 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);
        });
    });
};