Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何根据可变请求数据智能地更新Mongoose文档?_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Node.js 如何根据可变请求数据智能地更新Mongoose文档?

Node.js 如何根据可变请求数据智能地更新Mongoose文档?,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,对于我的编辑用户路线,我需要处理许多不同的可能情况。用户可以更新他们的个人资料,只更改他们的电子邮件地址或密码,但他们也可以同时更新一系列其他个人资料信息 findOneAndUpdate的优点是,您可以传递更新对象,它只会更改请求中与保存的数据不同的字段。这太棒了!一个巨大的问题——由于某种原因,该查询绕过了验证器和中间件,即使runValidators=true,它也绕过了预保存挂钩,这意味着密码更新绕过了加密 因此,我一直看到的解决方案是执行findOne或findById,手动更新字段,

对于我的编辑用户路线,我需要处理许多不同的可能情况。用户可以更新他们的个人资料,只更改他们的电子邮件地址或密码,但他们也可以同时更新一系列其他个人资料信息

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); 
  }
有没有办法模仿将updates对象传递给Mongoose的行为,我只需要给它req.body,让它只更新不同的字段

_.mergeuser,请求主体

这将合并**所有**。仅当您不关心安全性时使用

要限制到某些字段而不疯狂:

const { f1, f2, f3 } = req.body;
_.merge(user, { f1, f2, f3}) 
或参考以下内容: 矿粉中的特征稍不明显

_.merge(user, _.pick(req.body, ['f1', 'f2', 'f3']))

这其中的安全问题是什么?另外,基于需要一个具有安全问题的外部库来实现这一点,我是否应该假设这种处理更新的方法不是标准的?像我上面冗长的例子中那样设置更新/编辑路由更常见吗?lodash只是一个函数编程库。中的功能在其他函数式编程语言中很常见。在本例中,合并只是您所做的操作,但针对提供的每个字段。也就是说,如果有人输入一个{isAdmin:true,password:},它也会被合并到。可能不是你想要的。好吧,主要的问题是到目前为止你没有验证。显然,您希望确保正确的用户已登录,并且只允许他更改自己的帐户。并且用户只能修改允许修改的内容。因此,合理地说,u.mergeuser,u.pickreq.body,['email','profile\u pic','status',…]。您需要命名允许用户包含的任何内容。并检查是否允许他将其包括在内。以及是否包含的内容不太可笑,例如,10000字符的显示名称不合适。猫鼬可以在模型中处理其中一些问题,这很有道理。我已经在授权中间件后面保护了这条路径,我在模型中有一些合理的验证器和钩子。正如你所说,与_pick相结合是有意义的,因为用户可以修改的内容数量有限。