我遇到了一个问题,当使用哪一个,以下是更新功能的 Mongoose ,它的工作正常。
// Updates an existing form in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
Form.findById(req.params.id, function (err, form) {
if (err) { return handleError(res, err); }
if(!form) { return res.send(404); }
var updated = _.assign(form, req.body);
updated.formContent = req.body.formContent;
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, form);
});
});
};
已尝试以下操作替换表单数据。
_.assign(form, req.body); // Works (update database)
_.merge(form, req.body); // Not Work (database not updating, remain the same)
_.extend(form, req.body); // Works (update database)
上面的结果显示当post数据中有对象时合并不起作用。
请解释一下为什么一个不工作,其他的还可以。我看过以下问题
Lodash - difference between .extend() / .assign() and .merge()
但是我很好奇,想知道哪一个不会更新数据库,但是当应用assign和extend时,它就工作了。
1条答案
按热度按时间gk7wooem1#
在给定的代码片段中,更新数据库时_.assign()、.merge()和.extend()之间的行为差异可以归因于这些方法处理post数据中对象的方式。
.assign()和.extend()执行浅复制,这意味着它们将源对象(req.body)的属性直接复制到目标对象(form)。这包括嵌套对象,允许正确更新数据库。
另一方面,.merge()执行深度合并,递归地合并源对象和目标对象的属性。然而,.merge()并不直接修改目标对象,而是返回一个新的合并对象。因此,在给定的上下文中,使用_.merge()不会更新表单对象,从而不会对数据库进行任何更改。
要更详细地了解_.extend()、.assign()和.merge()之间的差异,可以查看我使用此方法的my project