对于我的Edit用户路线,我将需要处理许多不同的情况。用户可以更新其个人资料,仅更改其电子邮件地址或密码,但他们也可以一次更新整个其他个人资料信息。
findOneAndUpdate
的优点是您可以传递更新对象,并且它只会更改请求中与已保存数据不同的那些字段。这很棒!一个巨大的问题-该查询出于某种原因绕过了验证程序和中间件(即使使用runValidators=true
,它也绕过了预保存的钩子,这意味着密码更新绕过了加密)。
因此,我到处都看到的解决方案是执行findOne
或findById
,手动更新字段,然后运行user.save()
。
但是,由于用户记录相当复杂,这意味着我的路线看起来像这样,并且很难维护:
exports.editUser = async function(req, res, next) {
try {
const id = req.params.id;
let user = await db.User.findById(id);
user.email = req.body.email;
user.fullName = req.body.fullName;
user.password = req.body.password;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
let updatedUser = await user.save();
return res.status('200').json(user);
}
是否有任何方法可以模仿将更新对象传递给Mongoose的行为,在这里我可以给它req.body
并让它仅更新不同的字段?
答案 0 :(得分:1)
https://lodash.com/docs/4.17.11#merge
_。merge(用户,要求正文)
这将合并“一切”。仅在不关心安全性的情况下使用。
要限制在某些领域而不会发疯:
const { f1, f2, f3 } = req.body;
_.merge(user, { f1, f2, f3})
或参考此:https://lodash.com/docs/4.17.11#pick
lodash的功能不太明显。
_.merge(user, _.pick(req.body, ['f1', 'f2', 'f3']))